C++和MATLAB混合编程(2)

通过长时间的测试直接调用MATLAB引擎库使用MATLAB运算速率很慢,而且生成的版本在其他电脑也没法使用,所以有了使用通过MATLAB生成DLL文件,调用DLL运算的情况,接下来写一下,我的从生成DLL到C++中成功调用的情况。

首先在MATLAB中生成DLL的步骤:
1、启动MATLAB编写需要生成DLL的代码(这是我的带通滤波,滤波函数是eeglab的函数):

% fun     BandPassFilter    带通滤波
% input
% data1                     要计算的数据
% locutoff                  高于locutoff通过
% hicutoff                  低于hicutoff通过
% fs                        采样率
% output
% EEGNFFT                   没有进行FFT的数据
% EEGFFT                    进行FFT的数据
function [EEGNFFT,EEGFFT] = BandPassFilter(data1, locutoff, hicutoff, fs)
data1_1_detrend.data=data1;
N=length(data1_1_detrend.data);
data1_1_detrend.srate = fs; % 采样率
data1_1_detrend.trials = 1; % trial 数
data1_1_detrend.event = [ ]; % trial 数
data1_1_detrend.pnts = N; % 采样点数
[data1_2_FIR, com, b] = pop_eegfiltnew(data1_1_detrend,locutoff,hicutoff);
EEGNFFT = data1_2_FIR.data;
EEGFFT = fft(EEGNFFT);
end

2、在MATLAB命令行窗口中输入:

mex -setup选择mex -setup C++(另一个我也没有查过生成的是什么)

3、选择后在MATLAB命令行窗口再输入:

mbuild -setup,选择同2

4、最后在MATLAB命令行窗口中再输入:

mcc -W cpplib:mydll -T link:lib test.m 
(其中mydll是你要生成的.h、lib库和dll名,test.m是你要执行的MATLAB的m文件)

这样就会在m文件中所在位置生成一堆文件,其中包含:.cpp/.def/.dll/.exp/.exports/.h/.lib/.log/.txt,其中值得看的有log日志和readme.txt这里面也许你会有收获。

其次,开始vs2010 C++端的DLL调用
1、首先属性的设置

1> C/C++中常规里面的附加包含目录:
将MATLAB中的extern文件下的include文件添加进来
还有将extern下的include下的win32或win64添加进来
(我这里添加的win64,因为我的win64比较全,而且开发的是win64的软件所有就用的win64)
2>链接器中的输入下的附加依赖库:
我见有的人说添加3个就可以,分别是自己的生成的lib库、MATLAB中的mclmcrrt.lib和mclmcr.lib库,我又添加了3个。
因为用到了这几个头文件,分别是libmex.lib、libmx.lib和libmat.lib,所以共6个。
3> 链接器中的常规下的附加库目录:
这个目录是MATLAB中extern-lib-win64-Microsoft,如果是32的添加32位的应该就可以
4> 我这里还添加了几个头文件,运行时候报错就添加了,具体用到没有就不清楚了,分别是mat.h/matrix.h/mclbase.h/mclcppclass.h/mclmcr.h/mclmcrrt.h/tmwtypes.h这几个头文件。

2、代码中需要设置的
在需要用到的地方,添加用到的dll头文件,然后附加库 #pragma comment(lib, “BandPassFilter.lib”);
接下来的就是在计算了这里是变量的设置,已经值得获取

    //MATRIXNUMBER一个宏定义,设置要在MATLAB中用的变量
    mwArray imSaveDataFirst(1, MATRIXNUMBER, mxDOUBLE_CLASS); 
    mwArray imSaveNFFTData(1, MATRIXNUMBER, mxDOUBLE_CLASS);
    double dbRowDataArray[1][MATRIXNUMBER];
    for ( size_t i = 0; i < MATRIXNUMBER; i++ )
        dbRowDataArray[0][i] = deqEEGData.at(i);

    imSaveDataFirst.SetData(*dbRowDataArray, MATRIXNUMBER);//这里是设置数据,用来到MATLAB中计算

    /*要调用的函数,这个函数要看你的参数和返回值,如果你1个参数一个返回值
    那么这个函数就有有3个变量,第一个整形为你要返回几个参数值,我返回两个值,所以我的是2*/

    double dbNFFTDataArray[1][MATRIXNUMBER];
    imSaveNFFTData.GetData(*dbNFFTDataArray, MATRIXNUMBER); // 获取值到C++数组中 

这就是最近学习到的C++中代用MATLAB计算函数,这个比直接调用效率高很多,而且感觉计算也很流畅,感觉比原来调用限制也小了很多。

猜你喜欢

转载自blog.csdn.net/bloke_come/article/details/75305457