【例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源代码(续)相关推荐

  1. Matlab.NET混合编程调用Figure窗体

    原文:[原创]Matlab.NET混合编程调用Figure窗体 1.前言 做Matlab.NET混合编程好几年了,虽然Matlab很多函数忘记得差不多了,但基本的东西还是能熟练使用.特别是在C#调用M ...

  2. c 使用matlab引擎,[转载]C与MATLAB混合编程之调用MATLAB引擎

    Visual Studio调用MATLAB需要的配置已经在<Visual Studio调用MATLAB的配置>一文中给出了详细的步骤,本文将介绍混合编程的示例. 在C中调用MATLAB,据 ...

  3. matlab常用工具箱的调用指令

    转自:http://blog.sina.com.cn/s/blog_86186c970102va9g.html Matlab常用工具箱的调用命令 1. 优化工具箱​​ 用途:优化问题 调用命令:在Co ...

  4. fortran调用matlab画图,[转载]Matlab与Fortran的交互--基本概念

    如果需要进行Matlab环绕Fortran语言的交互,必须通过Matlab提供的应用编程接口(API)来实现与外部的接口,从而可以在Matlab环境中实现调用Fortran程序.输入或输出数据以及和其 ...

  5. c 与matlab混编,C与MATLAB混合编程之调用MATLAB引擎

    Visual Studio调用MATLAB需要的配置已经在<Visual Studio调用MATLAB的配置>一文中给出了详细的步骤,本文将介绍混合编程的示例. 在C中调用MATLAB,据 ...

  6. C++ 接口 函数导出_Matlab与C/C++混合编程、Visual C++与Matlab封装库互相调用相关要点...

    [版本说明] Visual Studio 2010 Matlab2014a 64bit Windows7 64bit 以下是我安装的 Matlab2014a 支持的 C++混合编译器的SDK版本(为了 ...

  7. MATLAB 提取*.m 文件调用的所有函数

    MATLAB 提取*.m 文件调用的所有函数 clc clear filename = 'processGRDECL.m'; %依赖父文件 dir_colections = [pwd '\collec ...

  8. matlab电机算法仿真,MATLAB电机仿真精华50例源代码

    [实例简介] MATLAB电机仿真精华50例源代码,包括同步电机,异步电机的仿真模型,和闭环控制等 [实例截图] [核心代码] <MATLAB电机仿真精华50例>源代码 └── <M ...

  9. matlab自带电机案例,MATLAB电机仿真精华50例,源代码

    [实例简介] MATLAB电机仿真精华50例,源代码,MATLAB电机仿真精华50例,源代码,包括直流电机,异步电机,同步电机. [实例截图] [核心代码] MATLAB电机仿真精华50例,源代码 └ ...

最新文章

  1. python画画代码大全_太赞了,微软正式推出 Python 零基础教程!
  2. c++ 回调函数_Java中的回调机制,这篇给你整的明明白白的
  3. 手机加速度计数据可以被随意读取,iOS关不掉权限,安卓这次能限制
  4. Sublime Text 2 和 Verilog HDL
  5. OpenCV copyMakeBorder()来拓展边界
  6. CodeVS 1044 拦截导弹(DP)
  7. paip.python连接mysql最佳实践o4
  8. 来自汽车行业的20个优秀的汽车推广网站
  9. pclint html报告,PC-lint 9 + 中文手册
  10. 机器人学领域的顶级期刊总结
  11. Ubuntu配置静态IP以及interfaces配置不生效问题解决
  12. android 圆角 水波纹_Android实现水波纹点击效果
  13. 语音识别(ASR)论文优选:性能测试Wav2Vec2.0 on the Edge: Performance Evaluation
  14. python 多态app_python 多态
  15. wps打开html文件乱码,wps文档打开以后乱码为什么
  16. python安装教程(Win8环境)
  17. C++的重载操作符(operator)介绍
  18. Android ViewPager Parallax视觉差切换动画
  19. Android处理图片OOM的若干方法小结
  20. linux pptp设置账号不能同时登录 查询已登录用户

热门文章

  1. Martini源码剖析
  2. HDU 5527:Too Rich(DFS+贪心)***
  3. HDU 1540 Tunnel Warfare
  4. win2003系统网络安装——基于linux+pxe+dhcp+tftp+samba+ris
  5. Object-C时间与字符串的转化 因多语言设置中造成返回Nil的解决方法
  6. 剖析SQL Server执行计划
  7. 馒头,国庆节快乐啊!!~~~!
  8. 奇怪的.strip(alir) #()里面有东西 待问老师........
  9. css中小知识点总结
  10. 用cxSelect插件补充一下回显过滤项功能