matlab axb c,matlab调用C源代码(续)
【例2】試用MEX文件求5階完全圖鄰接矩陣的特征值及對應(yīng)的特征向量。
下面是求該矩陣的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計(jì)算特征值
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函數(shù),以實(shí)現(xiàn)MEX空間與其它空間交換數(shù)據(jù)的任務(wù),具體可以參看MATLAB幫助文檔。
5.4建立二維雙精度矩陣函數(shù)mxCreateDoubleMatrix
其格式具體如下:
#include "matrix.h"
mxArray *mxCreateDoubleMatrix(int m,
int n, mxComplexity ComplexFlag);
其中m代表行數(shù),n代表列數(shù),ComplexFlag可取值mxREAL
或mxCOMPLEX。如果創(chuàng)建的矩陣需要虛部,選擇mxCOMPLEX,否則選用mxREAL。
類似的函數(shù)有:
mxCreateCellArray
創(chuàng)建n維元胞mxArray
mxCreateCellMatrix
創(chuàng)建二維元胞mxArray
mxCreateCharArray
創(chuàng)建n維字符串mxArray
mxCreateCharMatrixFromStrings
創(chuàng)建二維字符串mxArray
mxCreateDoubleMatrix
創(chuàng)建二維雙精度浮點(diǎn)mxArray
mxCreateDoubleScalar
創(chuàng)建指定值的二維精度浮點(diǎn)mxArray
mxCreateLogicalArray
創(chuàng)建n維邏輯mxArray,初值為false
mxCreateLogicalMatrix
創(chuàng)建二維邏輯mxArray,初值為false
mxCreateLogicalScalar
創(chuàng)建指定值的二維邏輯mxArray
mxCreateNumericArray
創(chuàng)建n維數(shù)值mxArray
mxCreateNumericMatrix
創(chuàng)建二維數(shù)值mxArray,初值為0
mxCreateScalarDouble
創(chuàng)建指定值的雙精度mxArray
MxCreateSparse
創(chuàng)建二維稀疏mxArray
mxCreateSparseLogicalMatrix
創(chuàng)建二維稀疏邏輯mxArray
MxCreateString
創(chuàng)建指定字符串的1 n的串mxArray
mxCreateStructArray
創(chuàng)建n維架構(gòu)mxArray
mxCreateStructMatrix
創(chuàng)建二維架構(gòu)mxArray
5.5 獲取行維和列維函數(shù)mxGetM、mxGetN
其格式如下:
#include "matrix.h"
int mxGetM(const mxArray
*array_ptr);
int mxGetN(const mxArray
*array_ptr);
與之相關(guān)的還有:
mxSetM:設(shè)置矩陣的行維
mxSetN:設(shè)置矩陣的列維
5.6 獲取矩陣實(shí)部和虛部函數(shù)mxGetPr、mxGetPi
其格式如下:
#include "matrix.h"
double *mxGetPr(const mxArray
*array_ptr);
double *mxGetPi(const mxArray
*array_ptr);
與之相關(guān)的函數(shù)還有:
mxSetPr:設(shè)置矩陣的實(shí)部
mxSetPi:設(shè)置矩陣的虛部
【例3】實(shí)現(xiàn)字符串的倒序輸出。
#include "mex.h"
void revord(char *input_buf,int
buflen,char *output_buf)
{
int i;
//實(shí)現(xiàn)字符串倒序
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;
//檢查輸入?yún)?shù)個數(shù)
if(nrhs!=1)
mexErrMsgTxt("One input required.");
else
if(nlhs>1)
mexErrMsgTxt("Too many output arguments.");
//檢查輸入?yún)?shù)是否是一個字符串
if(mxIsChar(prhs[0])!=1)
mexErrMsgTxt("Input must be a string.");
//檢查輸入?yún)?shù)是否是一個行變量
if(mxGetM(prhs[0])!=1)
mexErrMsgTxt("Input must a row vector.");
//得到輸入字符串的長度
buflen=(mxGetM(prhs[0])*mxGetN(prhs[0]))+1;
//為輸入和輸出字符串分配內(nèi)存
input_buf=mxCalloc(buflen,sizeof(char));
output_buf=mxCalloc(buflen,sizeof(char));
//將輸入?yún)⒘康膍xArray結(jié)構(gòu)中的數(shù)值拷貝到C類型字符串指針
status=mxGetString(prhs[0],input_buf,buflen);
if(status!=0)
mexWarnMsgTxt("Not enough space. String is truncated.");
//調(diào)用C程序
revord(input_buf,buflen,output_buf);
plhs[0]=mxCreateString(output_buf);
}
這個程序中需要注意的地方是mxCalloc函數(shù),它代替了標(biāo)準(zhǔn)C程序中的calloc函數(shù)用于動態(tài)分配內(nèi)存,而mxCalloc函數(shù)采用的是MATLAB的內(nèi)存管理機(jī)制,并將所有申請的內(nèi)存初始化為0,因此凡是C代碼需要使用calloc函數(shù)的地方,對應(yīng)的Mex文件應(yīng)該使用mxCalloc函數(shù)。同樣,凡是C代碼需要使用realloc函數(shù)的地方,對應(yīng)的Mex文件應(yīng)該使用mxRealloc函數(shù)。
在MATLAB命令窗口中對revord.cpp程序代碼編譯鏈接:
>> mex
revord.cpp
在MATLAB命令窗口中對C-MEX文件revord.dll進(jìn)行測試:
>> x='I
am student.';
>>
revord(x)
ans =
.tneduts ma I
總結(jié)
以上是生活随笔為你收集整理的matlab axb c,matlab调用C源代码(续)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图的存储结构matlab,matlab存
- 下一篇: 静态页面被拦截解决办法