混編終是乙個繞不開的石頭鴨~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);
endendend
2.輸入命令列編譯生成dll,輸入第一行進行mex設定,依次選擇c++,vs;設定成功後輸入第三行,檔名是希望生成dll的名字,函式名是主函式的名字,函式的呼叫matlab會自己處理,不用多餘操作。之後會在當前目錄下生成11個檔案,稍後需要用到dll,lib,ctf,**件。
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安裝位置調整吧:
附加庫:
matdll.lib
mclmcrrt.lib
mclmcr.lib
libmx.lib
libmat.lib
標頭檔案包含:
#include "matdll.h"
2.需要匯入生成的dll:
3.**呼叫,其中包含初始化,型別轉換,呼叫過程:
bool isok = 0;
; 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三維陣列)的過程。 Linux下C ,matlab混合程式設計
使用python呼叫c 呼叫matlab生成的動態庫檔案 1 設定編譯器為gcc,在matlab 命令列依次執行命令mex setup和mbuild setup.2 編寫matlab指令碼 3 生成動態庫檔案。mcc w cpplib libmyfunc t link lib myfunc.m c ...
linux系統中的C MATLAB混合程式設計
我研究的是影象盲去模糊演算法,因為前期msdecomp預處理是在linux下用c 寫成的,而後面的優化過程均是用matlab寫成的,因此我需要將這兩部分的 融合在一起。這裡記錄的是我在虛擬機器中在linux系統下實現matlab呼叫c 函式的過程。首先安裝vmware,並選擇系統檔案為ubuntu1...
C C 混合程式設計
c中呼叫c c 中呼叫c都會用到extern c 但兩者的意義卻大不一樣!例 c void foo int x c c code extern c void foo int x 讓c 聯結器能通過過類似於 foo來查詢此函式,而非類似於 foo int這樣的符號。使用extern c 則是告訴編譯器...