在用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.配...