matlab调用c语言

1、 下载MinGW-w64

(1) 用已有的MinGW-w64,则新增环境变量MW_MINGW64_LOC = D:\MinGW-w64\mingw64

(2) 若电脑中没有MinGW-w64,则下载TDM-GCC(注意看清64位还是32位),新增环境变量MW_MINGW64_LOC = C:\TDM-GCC-64 ( [http://tdm-gcc.tdragon.net/download ](http://tdm-gcc.tdragon.net/download))

  • PS: Matlab中设置环境变量 setenv(‘MW_MINGW64_LOC’,’D:\MinGW-w64\mingw64’)(临时)

    验证是否设置成功 getenv('MW_MINGW64_LOC')

2、 安装mex

mex –setup

3、

matlab默认的程序文件是.m文件,但有很多情况下需要用matlab调用C语言程序,归纳起来有以几种情况:

1、matlab程序中的某模块非常耗时,改用C语言编写可以提高执行速度。

2、现有成熟算法已经用C语言编写完成,但是matlab程序需要调用其中的某一算法,但不想改写成为.m程序

3、从.m程序可以直接获取源代码,为了保护知识产权,作者希望只提供接口,和库函数,供使用者调用。类似于Windows系统动态链接库(.dll)

Mex文件其实是一种动态链接库,旧版本Matlab可以直接调用.dll,新版本要调用.mexw32或.mexw64文件

Windows 64位 后缀名为mexw64

Wincdows32位 后缀名为mexw32

Linux 64位 后缀名为 mexaw64

使用mex时的注意事项:

1.MATLAB调用mex接口时,将参数个数及参数指针传入接口子程序,由接口子程序完成指针和调用变量的赋值、输出数据的内存空间分配,接口子程序再将参数指针或经过赋值的变量作为参数传递给C的计算子程序,完成调用过程。调用时应注意指针所指对象的正确性,为处理正确最好做相应的强制类型转换。

2.mex并不便于调试,因此应在C的IDE中用测试集调试后再放入mex文件中。

3.MATLAB中指向二维及高维数组的指针递增方式是按行递增的,而C中是按列递增的,因此计算index时要注意位置。

Matlab R2018a之后,复数的实部和虚部一起存储

Matlab R2017及之前,复数的实部和虚部分开存储

暂时默认使用分开存储方式,因此在高版本中若使用到了复数,则编译时需指定matlab版本

参考文献:

MinGW MinGW-w64 TDM-GCC等工具链之间的区别与联系

https://blog.csdn.net/crazycoder8848/article/details/25164471

matlab调用c的示例程序

https://blog.csdn.net/qq_39709535/article/details/84593767

matlab和C混合编程科普性文章*

https://zlearning.netlify.com/communication/matlab/matlabandc.html

https://max.book118.com/html/2017/0618/116360759.shtm

matlab 不同版本复数存储问题

https://ww2.mathworks.cn/help/matlab/matlab_external/upgrade-mex-files-to-use-interleaved-complex.html

https://ww2.mathworks.cn/help/matlab/matlab_external/matlab-support-for-interleaved-complex.html

https://stackoverflow.com/questions/57167153/issues-with-a-mex-mxgetdoubles-function-when-compiling

matlab官方mex帮助文档

https://ww2.mathworks.cn/help/matlab/ref/mex.html

查询matlab为mexFunction提供的函数

https://ww2.mathworks.cn/help/matlab/cc-mx-matrix-library.html?s_tid=CRUX_lftnav

https://zlearning.netlify.com/communication/matlab/matlabcmexapi

VS code 从入门到进阶

https://www.zhihu.com/lives/1124809477068849152

img

img