matlab 2012 vs2010混合编程

原文地址:http://www.cnblogs.com/newpanderking/articles/4057977.html

1、背景

众所周知,matlab在处理矩阵、数学计算、计算机仿真、图像处理等方面有着 c c++无可比拟的优势,但是做成系统供使用时,又显得过于粗糙,为了使用起来高大上,计算起来有简单,方便。无疑,c++ 与matlab混合编程将会使非常靠谱的选择。

这里暂且不论所谓的matlab效率低,c/c++效率高的问题,自我感觉,以我目前编码的功底,所编写的代码的效率远远不及matlab提供的代码的效率。除非你是大牛,或者你是人云亦云,所以能用matlab混合c++编码还是很不错的选择,话不多说,我们开始讨论正题。

2、我使用的版本是matlab2012与vs2010混合编程的。

软件的下载这里就不多说了,我相信看这篇教程的你,这两个软件已经安装的妥妥当当的了。

这里我选用网上常用来做例子的matlab代码做测试,spline.m,该文件位于

D:\Program Files\MATLAB\R2012a\toolbox\matlab\polyfun

当然该文件中依赖调用另一个文件chckxy.m,该文件也在这条路径下。找到后复制到matlab的工作目录下。

这里为了方便提供两个文件的代码:

spline.m

 View Code

chckxy.m

 View Code

ps:说明下,由于这两个文件都是matlab的工具文件,所以chckxy.m在调用时,改了名字叫做mychckxy.m,相应的文件名字也需要改。

做一个简单的测试,做一个调用:

复制代码
clc; clear all; close all; x = 0:10; y = sin(x); xx = 0:.25:10; yy = spline(x,y,xx) plot(x,y,'o',xx,yy);
复制代码

运行结果:

matlab 2012 vs2010混合编程_第1张图片matlab 2012 vs2010混合编程_第2张图片

 

到此为止,都是准备工作做,下面开始介绍如何在vs中调用spline函数。

1)在matlab中输入命令 mbuild -setup , 运行结果如下图所示, 按照提示选择编译器 vs2010.

mbuild -setup

matlab 2012 vs2010混合编程_第3张图片

然后键入:mex -setup 命令,运行结果如下图所示,按照提示选择编译器 vs2010

mex -setup

matlab 2012 vs2010混合编程_第4张图片

 

然后在matlab命令窗口输入:

 mcc -W cpplib:libspline -T link:lib spline.m

可以得到如下图这些文件:

matlab 2012 vs2010混合编程_第5张图片

依然,其中的"libspline.dll"、"libspline.h"和"libspline.lib"这三个文件是我们所需的。

matlab 2012 vs2010混合编程_第6张图片

 

2)打开vs2010建一个控制台应用程序,可以选择一个空的控制台应用程序。

创建程序之后把第一步中得到的三个文件copy到工程中。

matlab 2012 vs2010混合编程_第7张图片

 

由于我的电脑是win 7 64bit,matlab是64bit,所以应该选择x64,而不是win32平台。

a)修改平台参数,为x64

生成 ---> 配置管理器 

matlab 2012 vs2010混合编程_第8张图片

 

matlab 2012 vs2010混合编程_第9张图片

b)配置包含目录与库目录

项目 ----> 属性 ----> vc++目录

matlab 2012 vs2010混合编程_第10张图片

包含目录:

D:\Program Files\MATLAB\R2012a\extern\include

 

matlab 2012 vs2010混合编程_第11张图片

matlab 2012 vs2010混合编程_第12张图片

库目录:

D:\Program Files\MATLAB\R2012a\extern\lib\win64\microsoft

 

matlab 2012 vs2010混合编程_第13张图片

matlab 2012 vs2010混合编程_第14张图片

c)配置附加依赖项 , 这里根据项目的不同,依赖的文件不同,这里测试依赖的是"mclmcrrt.lib"和"libspline.lib"这两个lib,第一是库lib,第二个是我们生成的lib.文件。所依赖的lib文件在库目录已经说明了,

路径为:D:\Program Files\MATLAB\R2012a\extern\lib\win64\microsoft下。

这里有两种解决方案,第一种在vs中配置。

项目 ----> 属性 ----> 连接器 ----> 输入 

matlab 2012 vs2010混合编程_第15张图片

matlab 2012 vs2010混合编程_第16张图片

第二种方法是,在文件中直接引入lib文件。

 

做完以上工作后,我们新建一个主函数作为入口函数,具体测试代码如下:

复制代码
#include "libspline.h"    //增加头文件
#include <cmath> #include <iostream> #include <iomanip>
using namespace std; #pragma comment(lib,"mclmcrrt.lib")
#pragma comment(lib,"libspline.lib")



int main() { //初始化lib(必须)
    if (!libsplineInitialize()) return -1; int i, j; double x[1][11], y[1][11]; for(i=0; i<11; i++) { x[0][i] = i; y[0][i] = sin(x[0][i]); } double xx[1][41]; for(i=0; i<41; i++) xx[0][i] = i*0.25; double yy[1][41]; mwArray mwX(1,11,mxDOUBLE_CLASS); mwArray mwY(1,11,mxDOUBLE_CLASS); mwArray mwXX(1,41,mxDOUBLE_CLASS); mwArray mwYY(1,41,mxDOUBLE_CLASS); mwX.SetData(*x, 11); mwY.SetData(*y, 11); mwXX.SetData(*xx, 41); mwYY.SetData(*yy, 41); spline(1, mwYY, mwX, mwY, mwXX);    //调用spline
 cout<<"yy = "<<endl; i = 0; for(j = 0; j < 41; j++) { //Get第一个参数表示用1个下标访问元素,j+1是列号(MATLAB下标从1开始,而C++从0开始,故做+1操作)
        yy[0][j] = mwYY.Get(1,j+1); cout<<setprecision(4)<<right<<setw(10)<<yy[0][j]; i++; if(i%7 == 0) cout<<endl;    //换行
 } cout<<endl; //终止调用
 libsplineTerminate(); return 0; }
复制代码

 

运行结果如图:

matlab 2012 vs2010混合编程_第17张图片

比较这个结果与最开始我们测试matlab运行的结果,测试通过。matlab配置完成。

 

ps说明:配置过程中遇到的问题:

配置时经常遇到 LINK2019的错误。这种错误就是典型的lib缺失导入的问题。

复制代码
main.obj : error LNK2019: 无法解析的外部符号 mclGetMatrix_proxy,该符号在函数 "public: __cdecl mwArray::mwArray(unsigned __int64,unsigned __int64,enum mxClassID,enum mxComplexity)" (??0mwArray@@QEAA@_K0W4mxClassID@@W4mxComplexity@@@Z) 中被引用 1>main.obj : error LNK2019: 无法解析的外部符号 mclcppGetLastError_proxy,该符号在函数 "public: static void __cdecl mwException::raise_error(void)" (?raise_error@mwException@@SAXXZ) 中被引用 1>main.obj : error LNK2019: 无法解析的外部符号 mclcppCreateError_proxy,该符号在函数 "public: __cdecl mwException::mwException(void)" (??0mwException@@QEAA@XZ) 中被引用 1>main.obj : error LNK2019: 无法解析的外部符号 ref_count_obj_addref_proxy,该符号在函数 "public: __cdecl mwException::mwException(class mwException const &)" (??0mwException@@QEAA@AEBV0@@Z) 中被引用 1>main.obj : error LNK2019: 无法解析的外部符号 ref_count_obj_release_proxy,该符号在函数 "public: virtual __cdecl mwException::~mwException(void)" (??1mwException@@UEAA@XZ) 中被引用 1>main.obj : error LNK2019: 无法解析的外部符号 error_info_get_message_proxy,该符号在函数 "public: virtual char const * __cdecl mwException::what(void)const " (?what@mwException@@UEBAPEBDXZ) 中被引用 1>main.obj : error LNK2019: 无法解析的外部符号 array_ref_getV_int_proxy,该符号在函数 "public: class mwArray __cdecl mwArray::GetPromoted(unsigned __int64,...)" (?GetPromoted@mwArray@@QEAA?AV1@_KZZ) 中被引用 1>main.obj : error LNK2019: 无法解析的外部符号 array_ref_set_numeric_mxDouble_proxy,该符号在函数 "public: void __cdecl mwArray::SetData(double *,unsigned __int64)" (?SetData@mwArray@@QEAAXPEAN_K@Z) 中被引用 1>main.obj : error LNK2019: 无法解析的外部符号 array_ref_get_numeric_mxDouble_proxy,该符号在函数 "public: __cdecl mwArray::operator double(void)const " (??BmwArray@@QEBANXZ) 中被引用 
复制代码

这里是因为缺少:mclmcrrt.lib

#pragma comment(lib,"mclmcrrt.lib")

即可解决。

你可能感兴趣的:(matlab 2012 vs2010混合编程)