Matlab2010与VS2010初吻(一)
来源:互联网 发布:三国志13隐藏武将数据 编辑:程序博客网 时间:2024/04/29 19:26
(最近因程序中需要数值计算和做图表,研究了matlab与vs混合编程。结合网上的各种版本及个人摸索,找到一种可行且又简单易学的方法,现拿与大家分享)
一、在Matlab中用m文件生成C/C++的DLL
打开Matlab
在command窗口输入mex-setup选择编译器
在command窗口输入mbuild-setup选择编译器
写一个正确的m函数(如add.m),放在可找到路径中
在command窗口输入 mcc -B csharedlib: rename Jadd.m(rename 是生成各种C文件的命名,Jadd.m是要编译的m 函数所在m文件)
或者: mcc -W lib:myadd -T link:lib add.m(用于C的)
mcc -W cpplib:myadd -T link:lib add.m(用于C++的)
mcc -C -W cpplib:myadd -T link:lib add.m(这个多生成一个.ctf文件,有时要用到,推荐这个)
(现在耐心等一会,matlab会生成你所需的东西并放到它的默认路径下)
二、创建和配置项
(一)、在VS2010里新建一个C++控制台程序
(二)、把用matlb文件生成的dll、lib、h等一并拷到该程序目录里
(三)、(这里以MatlabR2010b为例)把R2010b\\extern\\include和R2010b\\extern\\lib\\win32\\microsoft这这两个夹拷到你的程序目录(不同matlab版本放的位置及命名略有不同,总能找到的)
(四)、在VS2010里的解决方案资源管理器中的项目图标右击》属性》VC++目录
然后 (1)在包含目录中添加你从matlab拷出来的include夹
(2)在库目录中添加你从matlab拷出来的microsoft夹
(五)、这样就差不多了(个人感觉这是最简单的方式),下面开始写代码(注意 J_add是我自己的lib名字哦,要换成你的):
三、在代码中调用DLL
#pragma once#pragma comment(lib,"J_add.lib")#pragma comment(lib,"mclmcrrt.lib")#pragma comment(lib,"mclmcr.lib")#include<iostream>#include "mclmcrrt.h"#include "J_add.h"int main(){std::cout<<"function y = J_add(A)"<<std::endl;if(!mclInitializeApplication(NULL,0)) //初始化MCR,用完还要关闭,节省资源{std::cout<<"could not initialize the application!"<<std::endl;return -1;}if(!J_addInitialize())//初始化应用,用完还要关闭,节省资源{std::cout<<"could not initialize J_add!"<<std::endl;return -1;}try{mwArray in1(2,2,mxDOUBLE_CLASS);mwArray in2(2,2,mxDOUBLE_CLASS);mwArray out(1,mxDOUBLE_CLASS);//下面将C++矩阵赋给m矩阵:double *in1Data = new double[4];for(int i=0;i<4;i++){in1Data[i] = 1.0*(i+1);}std::cout<<"input1="<<std::endl;std::cout<<in1Data[0]<<" "<<in1Data[1]<<std::endl;std::cout<<in1Data[2]<<" "<<in1Data[3]<<std::endl;in1.SetData(in1Data,4);////m矩阵直接赋值法:in2(1,1) = 1;in2(1,2) = 2;in2(2,1) = 3;in2(2,2) = 4;//将m矩阵赋给C++矩阵:double *in2Data = new double[4];in2.GetData(in2Data,4);std::cout<<"input2:"<<std::endl;std::cout<<in2Data[0]<<" "<<in2Data[1]<<std::endl;std::cout<<in2Data[2]<<" "<<in2Data[3]<<std::endl; //调用DLL函数J_add(该函数名字通原m文件中命名相同)add(1,out,in1);//std::cout<<"size of output:"<<out.operator size_t()<<std::endl;std::cout<<"value of output:"<<out.ToString()<<std::endl;delete []in1Data;delete []in2Data;}catch(const mwException&e){std::cerr<<e.what()<<std::endl;}J_addTerminate();//结束lib引用mclTerminateApplication();//结束MCRreturn 0;}
附:上面例子中的m文件add.m原文如下:
function sum = add(A)%用于C/C++的通用的求和函数sum = sum(sum(A));end
- Matlab2010与VS2010初吻(一)
- matlab2010+vs2010配置
- 《初吻》
- 在matlab2010中使用VS2010建立MEX文件
- 与iOS的初吻---方法命名与调用
- 初吻z
- 经典笑话:初吻
- VS2010 与 VC6.0 的不同(一)
- vs2010和matlab2010混合编程中char16_t重定义的问题
- 初吻,基因说了算
- 初吻的女孩
- Ogre学习笔记(一)xp系统 +VS2010+Ogre SDK 安装与首次编译
- OpenGL入门(一):基于VS2010的OpenGL环境的搭建与使用
- Ubuntu中安装Matlab2010
- VS2005调用MATLAB2010函数
- matlab2010激活问题
- OpenCV学习一:VS2010 + OpenCv2.4.9 的安装与配置
- 项目生命周期管理VS2010 ALM(一)
- Linux系统基本设置
- [总结]数据库管理(事务、ACID、并发、封锁、可串行化、隔离、……)
- PHP + Apache + Mysql配置
- sencha-touch如何集成广告
- oracle 误删除表数据恢复
- Matlab2010与VS2010初吻(一)
- 运维必须要知道的几个Linux服务器监控命令
- ARM-Linux交叉编译工具链搭建之LFS
- asp IIS部署An error occurred on the server when processing the URL错误提示解决
- Java读写锁
- SWT练习:简单计算器
- 顺序表和链表的比较
- spring配置文件中引用外部的properties文件
- org.springframework.orm.hibernate3.HibernateSystemException: a different object with the same identi