就我目前了解的c++呼叫matlab有兩種方法。
第一種是通過matlab引擎呼叫,也就是這裡用到的方法。
第二種是用matlab將m檔案編譯為相應的h/lib/dll檔案再加以呼叫。
使用engine所用到的h和lib檔案基本在d:\program files\matlab\r2010b\extern裡面,當然不同的機器安裝的地方都不一樣。
標頭檔案只需engine.h即可。lib檔案需要這三個:libmx.lib/libmat.lib/libeng.lib。至於如何配置我就不介紹了,方法很多。
引擎相應的部分函式如下:
engopen:啟動matlab引擎
engclose:關閉matlab引擎
enggetarray:從matlab引擎中獲得乙個matlab矩陣,用於資料交換
engputarray:從應用程式向matlab引擎傳送乙個matlab矩陣,用於資料交換
engevalstring:執行乙個matlab命令
engoutputbuffer:建立乙個用於儲存matlab文字輸出的字元緩衝區
相應例程:
#include #include#include
"engine.h
"using
namespace
std;
void
main()
//下面是將c++格式資料轉換為matlab格式可用資料
double data[4]=;
mxarray *y=mxcreatedoublematrix(1,4
,mxreal);
memcpy(mxgetpr(y),data,
sizeof
(data));
engputvariable(ep,"y
",y);
engevalstring(ep,
"plot(y,'o')
"); //
顯示資料
mxdestroyarray(y);
engevalstring(ep,
"figure
"); //
開乙個新的顯示視窗//
//下面是從matlab格式資料轉換為c++格式可用資料
在engine中讀取一張
engevalstring(ep,"
imshow(x)
"); //
顯示 mxarray *x=enggetvariable(ep,"
x"); //
從engine獲得真正的陣列x
int ndims=mxgetnumberofdimensions(x); //
獲得這個陣列的維數
coutint *dims=new
int[ndims];
memcpy(dims,mxgetdimensions(x),ndims*sizeof(int)); //
獲得陣列每一維的大小
for (int i=0;i)
cout
*double *p=(double*)mxgetdata(x); //指向陣列x的指標以便能訪問陣列元素,影象資料量太大,這裡就不顯示了
for (int i=0;i*/
delete dims;
mxdestroyarray(x);
cout
<<"
good job.
"
get();
engclose(ep);
//關閉matlab引擎。
}
由於整個環境離不開matlab,所以程式還需相應的dll檔案才能執行。
matlab的結構實在複雜,所以我也不太清楚究竟需要哪些dll,我就圖簡單了,直接把生成的檔案移到了matlab可執行目錄下了。
通常是這個目錄:d:\program files\matlab\r2010b\bin\win32
matlab練習程式(DBSCAN)
和kmeans相比,不需要事先知道資料的類數。以程式設計的角度來考慮,具體演算法流程如下 1.首先選擇乙個待處理資料。2.尋找和待處理資料距離在設定半徑內的資料。3.將找到的半徑內的資料放到乙個佇列中。4.拿佇列頭資料作為當前待處理資料並不斷執行第2步。5.直到遍歷完佇列中所有資料,將這些資料記為一...
matlab呼叫python程式
執行命令 pyversion filepath 若已關聯,則不需要執行此命令,其中 filepath 為 python 程式所用的直譯器的絕對路徑,如 d anaconda3 python.exe。詳見pyversion官方文件 例如呼叫某python函式 data2mat.getdata cd p...
MATLAB呼叫C C 函式的方法
已有 8167 次閱讀 2010 5 5 13 42 個人分類 遙感程式開發 系統分類 科研筆記 通過matlab將c c 函式編譯成mex函式,在matlab中就可以呼叫了。1,首先裝編譯器 matlab裡鍵入mex setup,選擇你要編譯c 的編譯器 2,寫c 函式 函式的形式必須是 void...