c++ matlab 混合编程

混编终是一个绕不开的石头鸭~so~~DO IT!我的版本是:VS2017+Matlab2016a

matlab中的程序处理:

1.需要将主程序写为函数形式,例如我这个主程序Matdll,形参三个(从c++获取,包括两个c++ char*转为matlab char,一个float*转为三维数组),返回值一个(返回给c++,matlab返回三维数组,c++中转为float*),主程序里调用自己写的函数是不用变的(变量类型转换写在c++程序里):

function result = Matdll(filepath,projectname,data)

if strcmp(projectname,'A') == 1
    result = func_A(filepath,data);
else if strcmp(projectname,'B') == 1
        result = func_B(filepath,data);
    end
end

end

2.输入命令行编译生成dll,输入第一行进行mex设置,依次选择c++,vs;设置成功后输入第三行,文件名是希望生成dll的名字,函数名是主函数的名字,函数的调用matlab会自己处理,不用多余操作。之后会在当前目录下生成11个文件,稍后需要用到dll,lib,ctf,h文件。

mex -setup
%mcc -W cpplib:文件名 -T link:lib 函数名.m -C
mcc -W cpplib:Matdll -T link:lib Matdll.m -C

vs中的处理:

1.需要配置vs中的matlab环境,根据matlab安装位置调整吧:

vc++目录包含目录:
D:\Applications\MATLAB\R2016a\extern\include\win64
D:\Applications\MATLAB\R2016a\extern\include

库目录:
D:\Applications\MATLAB\R2016a\extern\lib\win64\microsoft
D:\Applications\MATLAB\R2016a\extern\lib

附加库:
Matdll.lib
mclmcrrt.lib
mclmcr.lib
libmx.lib
libmat.lib

头文件包含:
#include "Matdll.h"

2.需要导入生成的dll:

将dll,lib,h文件复制到工程默认目录下,比如我的工程名是QtGuiApplication,路径就是QtGuiApplication\QtGuiApplication(应该是c++里的一级相对路径)。将dll,lib,ctf文件复制到QtGuiApplication\x64\Debug路径下(我是64位Debug编译运行)。

3.代码调用,其中包含初始化,类型转换,调用过程:

bool isOk = 0;
	if (mclInitializeApplication(NULL, 0))
	{
		if (!filpathqstr.isEmpty())
		{
			isOk = MatdllInitialize();
 
			mwArray mwfilepath(filepath);//将filepath(char*)转成matlab可识别形式,会识别为char
			mwArray mwfilework(filework);//将filework(char*)转成matlab可识别形式,会识别为char
			const mwSize dims[3] = { imgWidth, imgHeight, BandCount };
			mwArray SImg(3, dims, mxSINGLE_CLASS);
			SImg.SetData(pData, imgWidth* imgHeight* BandCount);//将pdata(float*)转成matlab三维数组

			mwArray mw_result;//声明一个返回值
			Matdll(1, mw_result, mwfilepath, mwfilework, SImg);//将数据从Matlab空间中取出,含义为,有一个返回值mw_result,其他是传入参数
			mwArray mwdims = mw_result.GetDimensions();
			int rsdims = mwdims.NumberOfElements();
			int *irsdims;
			int nimgWidth = mwdims.Get(rsdims, 1);
			int nimgHeight = mwdims.Get(rsdims, 2);
			int nbandcount = mwdims.Get(rsdims, 3);

			float *resultRaster = new float[nimgWidth * nimgHeight * nbandcount];
			mw_result.GetData(resultRaster, nimgWidth * nimgHeight * nbandcount);//返回值三维数组中取出数值赋给resultRaster(float*)

		}
	}

以上Demo最终实现了,c++传一个c++float*(matlab三维数组)和两个c++ char*(matlab char)给matlab,返回一个c++float*(matlab三维数组)的过程。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值