您的位置:首页 > 编程语言 > MATLAB

基础知识(二)matlab与c++混合编程之经验笔记

2015-04-21 10:58 633 查看

开发环境:win7 64位+vs2010+matlab

学习matlab与c++混合编程的路上有时候会遇到莫名其妙的错误,因此做一下记录:

1、由于系统是64位,装的matlab的链接库也是64位,如果使用win32控制台是32位,需要配置管理器-》配置为X64位

2、在c++中调用mwarray类,若未初始化,会出现直接运行没问题,然而调试的时候,出现内存异常,因此需要在调用mwarray前调用初始化函数mclInitializeApplication、及动态链接库的初始化函数。

3、matlab函数最好把函数返回的结果数据转置,因为matlab是根据列存储的,记住只是存储的时候有区别,但在matlab显示行列的时候并没有变,直接用mwarray的getdata()获取数据时,顺序会出错。

4、如果在matlab函数中有形参未被引用,可能会引起奔溃,例如 :

错误形式:

function [ output_args ] = test( input_args )

end

由于该代码中output_args 未被调用 在c++中编译后,会出现函数没有返回参数的错误,最终引起程序崩溃

正确应该为:

function [ output_args ] = test( input_args )

output_args=input_args;

end

5.返回参数问题:返回的参数直接声明对象为mwArray Y;而无需定义矩阵的宽高,但是切记需要被引用

6、在控制台应用程序中,如果matlab中有绘制图片等绘制函数,则程序运行后,不会跳出matlab绘制窗口;然而使用mfc程序调用,可以 跳出matlab的figure等窗口

7、不同的电脑上版本matlab不一致的时候,matlab需要重新生成链接库,否者估计编译完成后,运行的时候出现,找不到某个动态链接库的情况

8、调用前需要初始化模块,调用结束后要关闭matlab模块,共需要调用4句函数假设链接库名为:plotsintest

//调用前

if( ! mclInitializeApplication(NULL,0) )

{

fprintf(stderr, "Could not initialize the application.\n");

exit(1);

}

if (! plotsintestInitialize() )

{

fprintf(stderr,"Could not initialize the library.\n");

exit(1);

}

//matlab数据处理函数

processfunction();

//调用后

//两句要么不要调用,不调用可实现matlab模块与mfc程序窗口共存的功能,要么一起调用,调用将销毁matlab的相关窗口,或数据

plotsintestTerminate();//关闭函数 如果不关闭,matlab的绘制窗口不会被销毁

mclTerminateApplication();//关闭matlab函数

9、建议在mfc程序构造函数中调用mclInitializeApplication、plotsintestInitialize、析构函数中调用plotsintestTerminate、mclTerminateApplication,由于以上两个初始化函数的初始化时间很长,所以建议这么调用在程序启动的时候完成初始化,然后在进行程序中多次调用matlab函数。

10、matlab函数中不允许调用clear()函数,否则c++调用的时候回引起程序崩溃


本文地址:/article/7649350.html 作者:hjimce 联系qq:1393852684


更多资源请关注我的博客:http://blog.csdn.net/hjimce
原创文章,转载请保留本行作者信息

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: