matlab axb c,matlab调用C源代码(续)
【例2】試用MEX文件求5階完全圖鄰接矩陣的特征值及對應的特征向量。
下面是求該矩陣的MEX文件。
#include "mex.h"
void mexFunction(int nlhs,mxArray
*plhs[],int nrhs,const mxArray *prhs[])
{
double
x;
mxArray
*y,*z,*w;
int n;
if
(nrhs!=1)
mexErrMsgTxt("One inputs required.");
if (nlhs !=
3)
mexErrMsgTxt("Three output required.");
if
(!mxIsDouble(prhs[0])||mxGetN(prhs[0])*mxGetM(prhs[0])!=1)
mexErrMsgTxt("Input must be a scalar.");
x=mxGetScalar(prhs[0]);
plhs[0]=mxCreateDoubleMatrix(x,x,mxREAL);
plhs[1]=mxCreateDoubleMatrix(x,x,mxREAL);
plhs[2]=mxCreateDoubleMatrix(x,x,mxREAL);
n=mxGetM(plhs[0]);
y=plhs[0];
z=plhs[1];
w=plhs[2];
//利用mexCallMATLAB計算特征值
mexCallMATLAB(1,&plhs[1],1,prhs,"ones");
mexCallMATLAB(1,&plhs[2],1,prhs,"eye");
mexCallMATLAB(1,&plhs[0],2,&plhs[1],"-");
mexCallMATLAB(2,&plhs[1],1,&plhs[0],"eig");
//演示mexEvalString的功能
mexEvalString("y=y*2");
mexEvalString("a=a*2");
}
在MATLAB命令窗口輸入以下命令:
>> mex
Matlab_2.cpp
>>
clear
>>
a=magic(5)
a =
17?24?1?8?15
23?5?7?14?16
4?6?13?20?22
10?12?19?21?3
11?18?25?2?9
>>
[y,z,w]=Matlab_2(5)
??? Undefined function or variable
'y'.
a =
34?48?2?16?30
46?10?14?28?32
8?12?26?40?44
20?24?38?42?6
22?36?50?4?18
y =
0?1?1?1?1
1?0?1?1?1
1?1?0?1?1
1?1?1?0?1
1?1?1?1?0
z =
0.8333?-0.1667?-0.1667?0.2236?0.4472
-0.1667?0.8333?-0.1667?0.2236?0.4472
-0.1667?-0.1667?0.8333?0.2236?0.4472
-0.5000?-0.5000?-0.5000?0.2236?0.4472
0?0?0?-0.8944?0.4472
w =
-1?0?0?0?0
0?-1?0?0?0
0?0?-1?0?0
0?0?0?-1?0
0?0?0?0?4
由上面可以看出,K5的特征值為–1和4,其中–1是四重根。MATLAB提供了mexGetVariable、mexPutVariable函數,以實現MEX空間與其它空間交換數據的任務,具體可以參看MATLAB幫助文檔。
5.4建立二維雙精度矩陣函數mxCreateDoubleMatrix
其格式具體如下:
#include "matrix.h"
mxArray *mxCreateDoubleMatrix(int m,
int n, mxComplexity ComplexFlag);
其中m代表行數,n代表列數,ComplexFlag可取值mxREAL
或mxCOMPLEX。如果創建的矩陣需要虛部,選擇mxCOMPLEX,否則選用mxREAL。
類似的函數有:
mxCreateCellArray
創建n維元胞mxArray
mxCreateCellMatrix
創建二維元胞mxArray
mxCreateCharArray
創建n維字符串mxArray
mxCreateCharMatrixFromStrings
創建二維字符串mxArray
mxCreateDoubleMatrix
創建二維雙精度浮點mxArray
mxCreateDoubleScalar
創建指定值的二維精度浮點mxArray
mxCreateLogicalArray
創建n維邏輯mxArray,初值為false
mxCreateLogicalMatrix
創建二維邏輯mxArray,初值為false
mxCreateLogicalScalar
創建指定值的二維邏輯mxArray
mxCreateNumericArray
創建n維數值mxArray
mxCreateNumericMatrix
創建二維數值mxArray,初值為0
mxCreateScalarDouble
創建指定值的雙精度mxArray
MxCreateSparse
創建二維稀疏mxArray
mxCreateSparseLogicalMatrix
創建二維稀疏邏輯mxArray
MxCreateString
創建指定字符串的1 n的串mxArray
mxCreateStructArray
創建n維架構mxArray
mxCreateStructMatrix
創建二維架構mxArray
5.5 獲取行維和列維函數mxGetM、mxGetN
其格式如下:
#include "matrix.h"
int mxGetM(const mxArray
*array_ptr);
int mxGetN(const mxArray
*array_ptr);
與之相關的還有:
mxSetM:設置矩陣的行維
mxSetN:設置矩陣的列維
5.6 獲取矩陣實部和虛部函數mxGetPr、mxGetPi
其格式如下:
#include "matrix.h"
double *mxGetPr(const mxArray
*array_ptr);
double *mxGetPi(const mxArray
*array_ptr);
與之相關的函數還有:
mxSetPr:設置矩陣的實部
mxSetPi:設置矩陣的虛部
【例3】實現字符串的倒序輸出。
#include "mex.h"
void revord(char *input_buf,int
buflen,char *output_buf)
{
int i;
//實現字符串倒序
for(i=0;i
*(output_buf+i)=*(input_buf+buflen-i-2);
}
void mexFunction(int nlhs,mxArray
*plhs[],int nrhs,const mxArray *prhs[])
{
//定義輸入和輸出參量的指針
char
*input_buf,*output_buf;
int
buflen,status;
//檢查輸入參數個數
if(nrhs!=1)
mexErrMsgTxt("One input required.");
else
if(nlhs>1)
mexErrMsgTxt("Too many output arguments.");
//檢查輸入參數是否是一個字符串
if(mxIsChar(prhs[0])!=1)
mexErrMsgTxt("Input must be a string.");
//檢查輸入參數是否是一個行變量
if(mxGetM(prhs[0])!=1)
mexErrMsgTxt("Input must a row vector.");
//得到輸入字符串的長度
buflen=(mxGetM(prhs[0])*mxGetN(prhs[0]))+1;
//為輸入和輸出字符串分配內存
input_buf=mxCalloc(buflen,sizeof(char));
output_buf=mxCalloc(buflen,sizeof(char));
//將輸入參量的mxArray結構中的數值拷貝到C類型字符串指針
status=mxGetString(prhs[0],input_buf,buflen);
if(status!=0)
mexWarnMsgTxt("Not enough space. String is truncated.");
//調用C程序
revord(input_buf,buflen,output_buf);
plhs[0]=mxCreateString(output_buf);
}
這個程序中需要注意的地方是mxCalloc函數,它代替了標準C程序中的calloc函數用于動態分配內存,而mxCalloc函數采用的是MATLAB的內存管理機制,并將所有申請的內存初始化為0,因此凡是C代碼需要使用calloc函數的地方,對應的Mex文件應該使用mxCalloc函數。同樣,凡是C代碼需要使用realloc函數的地方,對應的Mex文件應該使用mxRealloc函數。
在MATLAB命令窗口中對revord.cpp程序代碼編譯鏈接:
>> mex
revord.cpp
在MATLAB命令窗口中對C-MEX文件revord.dll進行測試:
>> x='I
am student.';
>>
revord(x)
ans =
.tneduts ma I
總結
以上是生活随笔為你收集整理的matlab axb c,matlab调用C源代码(续)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图的存储结构matlab,matlab存
- 下一篇: matlab dfe 仿真,用matla