VS2013呼叫MATLAB內建函式

2021-06-22 12:09:50 字數 4346 閱讀 7895

在用c寫程式時,有時會遇到數值計算問題,如矩陣的計算、優化問題、解微分方程等等。這些數值計算問題如果自己來實現的話,一來太費時間,二來自己的實現方案效率未必高。所以遇到這些數值計算問題時可以先上網搜一下,看看有沒有現成的模組(當然要可靠)。另一種解決方法就是依靠matlab了。用過matlab 的人都知道,它提供了豐富的數值計算函式。在c程式中呼叫matlab函式即可輕鬆解決問題。

環境:

win7x64

matlab r2013a x64

visual studio 2013

步驟:

1.配置vs2013屬性表 專案屬性 - 配置屬性 - vc++目錄 -

包含目錄:d:\install\matlab\extern\include;

庫目錄:d:\install\matlab\extern\lib\win64\microsoft;

專案屬性 - 配置屬性 -鏈結器 - 輸入 - 附加依賴項:libmx.lib;libmat.lib;libeng.lib;

2.matlab的配置

配置環境變數(很重要,否則編譯會出現「找不到libmx.dll檔案」):d:\install\matlab\bin\win64;

在matlab命令列輸入mex -setup,按提示選擇合適的選項

在matlab命令列輸入mbuild -setup,按提示選擇合適的選項

以上配置只需進行一次就可以了,不必每寫乙個程式都重複一遍。

在c中呼叫matlab有兩種方法:

1.在c程式中呼叫matlab引擎

為了呼叫matlab引擎,首先需要引入相應的標頭檔案

#include "engine.h"

然後需要加如下幾行**,這樣順利地完成連線。

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

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

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

有時候你可程式所呼叫的函式可能還需要其他的庫。如果有鏈結錯誤提示的話,上網搜一下,然後按上述格式把需要的庫加上就可以了。

接下來就可以在需要的地方呼叫matlab引擎了。

使用時首先需要開啟引擎:

engine *ep;

if (!(ep = engopen("\0")))

接下來將c程式中相關的變數變為matlab需要的格式,一般使用mxcreatedoublematrix 和 memcpy函式。

完成轉換後使用engputvariable將資料送到matlab引擎。

最後呼叫engevalstring,將matlab命令作為其引數,就可以利用matlab引擎進行計算了。

計算完成後不要忘了清理工作: 使用mxdestroyarray清除mxcreatedoublematrix產生的變數,最後使用engclose關閉引擎。

下面是乙個例子,繪製y=sin(t)的影象:

#include #include #include #include "engine.h"

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

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

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

int main()

int nsample = 50;

const double pi = 3.1415926;

double *t = new double[nsample];

for (int i = 0; i < nsample; i++)

mxarray *t = null, *result = null;

t = mxcreatedoublematrix(1, nsample, mxreal);

memcpy((void *)mxgetpr(t), (void *)t, nsample*sizeof(t[0]));

engputvariable(ep, "t", t);

engevalstring(ep, "y=sin(t);");

engevalstring(ep, "plot(t,y);");

engevalstring(ep, "title('y=sin(t)');");

engevalstring(ep, "xlabel('t');");

engevalstring(ep, "ylabel('y');");

printf("hit return to continue\n\n");

fgetc(stdin);

mxdestroyarray(t);

engevalstring(ep, "close;");

engclose(ep);

return exit_success;

}

2.c程式呼叫matlab生成的dll

如果需要matlab完成的功能比較通用,如果用上述方法,則會產生大量的重複**。這裡要講的方法將對matlab 的呼叫做成乙個模組,這樣每次使用時只需呼叫這個模組就可以了。

首先將需要matlab完成的功能做成乙個matlab函式,然後利用mcc命令編譯,得到h、dll、lib等檔案,在c工程中只需加入上述檔案即可。

下面是乙個例子:

在做通訊**時通常是給地一組訊雜比,然後通過**得到在每個訊雜比下的誤位元速率,最後繪製出誤位元速率對訊雜比的曲線。

以前的做法是用c**,並將結果存在txt檔案中,最後讓matlab從txt檔案中讀取資料並繪圖。

利用這裡的方法,可以寫乙個matlab繪圖的模組,並在c程式的最後呼叫,這樣就能自動完成繪圖了。

matlab**:

function showber(snr_indb,ber)

semilogy(snr_indb,ber,'-o','linewidth',2);

grid on

xlabel('e_b/n_0(db)');

ylabel('ber');

在matlab命令列中輸入:mcc -b csharedlib:showber showber.m  得到一組檔案

將其中的.dll .h .lib檔案拷貝到c工程中。

在需要呼叫繪圖模組的cpp檔案中加入如下**

#include "showber.h"

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

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

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

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

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

下面的一段**顯示了呼叫繪圖模組的方法:

double snr = ;

double ber = ;

int len = sizeof(snr) / sizeof(snr[0]);

showberinitialize();

mxarray* xsnr = mxcreatedoublematrix(1, len, mxreal);

memcpy(mxgetpr(xsnr), (void*)snr, sizeof(snr));

mxarray* xber = mxcreatedoublematrix(1, len, mxreal);

memcpy(mxgetpr(xber), (void*)ber, sizeof(ber));

mlfshowber(xsnr, xber);

system("pause");

showberterminate();

1在呼叫繪圖模組之前需要呼叫showberinitialize

2在呼叫繪圖模組之後需要呼叫showberterminate

3使用mxcreatedoublematrix 和 memcpy 函式將c程式中的變數送入matlab中

4通過mlfshowber呼叫matlab模組。而mlf***函式的呼叫格式需要參考***.h(此例為showber.h)檔案中的宣告。

VS2013呼叫MATLAB 2014計算引擎

1 給計算機新增系統變數path c programfiles matlab r2014b bin win64,新增完成之後重新啟動計算機。一定要重新啟動很重要 2 新建乙個c 工程,新增x64屬性 很重要,應為matlab是64位的 3 屬性管理器 右鍵 屬性 配置屬性 vc 目錄 包含目錄 新增...

matlab2016a配置vs2013編譯器

前兩天因為編譯matconvnet20版本需要用到cuda7.5,於是在自己電腦上安裝了vs2013,系統是win10.結果安裝完成,編譯一直提醒使用vs的版本不合適,支支援10,11,12,13版本。上網搜查找到乙個靠譜的解決方法 有很重要的一點就是在matlab中查詢編譯器命令是 mex set...

matlab2015和vs2013混合程式設計

1.在matlab中輸入命令mbuild setup 此時matlab會自動尋找編譯器。確保matlab可以編譯c檔案 2.配置vs 將matlab安裝目錄中extern檔案中相應的include和lib檔案新增到vs的系統屬性中 包含c c 還有linker以及c c dictionary 3.配...