MATLAB程序生成C或C++代码

时间:2021-06-10 00:53:59

matlab程序转C/C++代码

常用的4种方式

第一种使用Mideva,涉及线程问题,并且永远只使用matlab6以前的版本

第二种就是使用Matlab引擎来调用m文件,也比较简单,但是必须在目标机器上安装matlab才行,这往往是不现实的。

第三种使用mcc将m文件编译成为C/C++代码,然后导入Vc编译,因为常常生成很多源代码,使用很繁琐。

第四种就是使用mcc将m文件编译为头文件、dll和lib然后导入VC编译。目前这是最可行的一种方法。

但是这几种方法都不利于维护,且程序没有可读性。能否适用要看结合自己的情况。这几种方法在这篇博客有比较详细的介绍——使用MATLAB Coder从MATLAB生成C/C++代码

一个简单的例子

这里是第3种方式的简单例子:

1、安装matlab2013a或者更新版本;

2、以简单一个简单的例子,两数相乘。生成一个foo.m文件;

function c = foo(a, b)%#codegen

%This function muliplies a and b

c = a * b
end

其中,%#codegen可以防止出现警告错误

3、在命令窗口,输入mex -setup,选中一个存在的编译器;

4、在命令窗口输入coder(图形界面),回车,弹出MATLAB Coder Project对话框;

5、在New选项卡Name中输入一个工程名foo.prj;点击Ok,弹出MATLAB Coder MEX Function对话框;

6、在Overview选项卡中,点击Add files,弹出对话框,选中foo.m打开;

7、单击变量a,选择Define by Example…,弹出MATLAB Coder Define by Example对话框,设置变量的类型。函数所传递的参数的类型和维数是必须确定的。

MATLAB程序生成C或C++代码)

8、选中Build选项卡,Output type中选择c/c++ Static Library;选中Generate code only;

9、点击More settings,Generalate Language选择C++;Close;

10、点击Build,进行编译;点击View report,弹出Code Generation Report对话框,此时,变量a、b、c会显示相应的变量信息;

11、利用vs2008建立一个控制台应用程序,将生成的相关文件.h头文件和.cpp文件拷到相关目录下并添加到应用程序中;

实际转化复杂一点的函数时有可能出错

例如matlab存在以下代码:

 %解方程T1^3+2*V_start*T1/J-L/J=0得到T1
%V_end2=V_start+J*T1^2
a=1;
b=0;
c=2*V_start/J;
d=-L/J;
x=roots([a b c d]);
T1=x(abs(imag(x))<1e-6);
T3=T1;
%时刻定义
time1=0:T:T1;

当Matlab函数的代码中存在time=0:T:T1;其中T是传进来的参数,T1是根据传进来的几个参数计算得到的。这样的代码有可能会出错,提示colon operand must be a real scalar.(冒号操作数必须是实数标量。)。

这里T1这个变量的维数以及是否是实数是不确定的。但是在time1=0:T:T1;语句中的冒号的操作数必须是实数标量。因此这样的代码需要确定T1是实数的标量。

12、在foo.cpp文件中添加#include “stdafx.h”;如果转化生成很多的.cpp文件,那么需要在所有的.cpp文件中添加#include “stdafx.h”。

13、test.cpp文件中代码为:

#include "stdafx.h"
#include "foo.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
double a = 0.0, b = 0.0, c = 0.0;
cin>>a>>b;
c = foo(a, b);
cout<<"c = "<<c<<endl;
return 0;
}

这样就完成了。

小结

对于简单的matlab程序转为c/c代码确实很方便。但是对于复杂的程序则会很多可能会出现很多问题,且转化得到的代码量常是原代码量的十倍。因此如果代码需要经常修改和维护的最好不要使用matlab转,而直接用c/c++写会更加好。


参考资料

举例说明使用MATLAB Coder从MATLAB生成C/C++代码步骤

使用MATLAB Coder从MATLAB生成C/C++代码