Matlab2010与VS2010初吻(一)

        (最近因程序中需要数值计算和做图表,研究了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();//结束MCR

	return 0;
}


 
附:上面例子中的m文件add.m原文如下:

    

function sum = add(A)
%用于C/C++的通用的求和函数
sum = sum(sum(A));
end


 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值