日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C/C++与Matlab混合编程初探

發布時間:2025/3/12 c/c++ 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C/C++与Matlab混合编程初探 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Matlab 擁有豐富的功能,編程簡單。不過,有些情況下,Matlab程序的執行速度比較慢。C/C++編譯執行的程序速度比較快,編程難度上比Matlab要高一些。因此存在一種方案,就是使用Matlab實現我們的實驗程序,用C/C++來實現Matlab程序中比較耗時的部分,從Matlab程序中調用C/C++的程序以實現加速。

?????本文主要講解如何在Matlab中調用C/C++的程序,以及如何編寫可供Matlab程序調用的C/C++程序。

???? 本文主要分以下幾部分:

???? Hello Matlab,用一個簡單的例子來說明如何在Matlab中調用C/C++的程序,以及可供Matlab調用的C/C++程序應該注意哪些基本事項。

???? Matlab調用C/C++程序傳遞參數。討論在C/C++中是如何使用Matlab傳來的參數的。

???? Matlab與C/C++混合編程的方法論。給出在一般情況下使用Matlab與C/C++混合編程的方法步驟,讓大家有一個較為清晰的應用此技術的思路。

???? 關于數據存儲的說明。說明數據在Matlab中的存儲方式。

?????注意:本文認為讀者會使用Matlab,掌握C/C++語言,并且有一臺計算機。計算機上安裝有Windows的操作系統,操作系統上裝有Matlab以及Visual Studio(比如VS2008,VS2010等)?;蛘哂嬎銠C上安裝有Linux的操作系統,系統上裝有Matlab,GCC。


hello Matlab

???? 我們一步步完成一個叫“Hello Matlab”的程序。

???? 第一步:在你的計算機D盤下,創建一個目錄命名為HiMat。在D:\HiMat目錄下創建一個文本文件,命名為“abhimat.cpp”。將Code 1中的代碼拷貝到“abhimat.cpp”文件中,保存。(注意,這里建立目錄以及命名等行為不是規定的,只是為了講解方便)。

第一步:在你的計算機D盤下,創建一個目錄命名為HiMat。在D:\HiMat目錄下創建一個文本文件,命名為“abhimat.cpp”。將Code 1中的代碼拷貝到“abhimat.cpp”文件中,保存。(注意,這里建立目錄以及命名等行為不是規定的,只是為了講解方便)。

[cpp] view plaincopy print?
  • #include?"mex.h"??
  • void?mexFunction?(int?nlhs,?mxArray?*plhs[],?int?nrhs,?const?mxArray?*prhs[])??
  • {??
  • ??mexPrintf("hello?matlab?in?C/CPP.\n");??
  • }??
  • #include "mex.h" void mexFunction (int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {mexPrintf("hello matlab in C/CPP.\n"); } Code 1, abhimat.cpp

    ???? “abhimat.cpp”就是將要在Matlab中被調用的C/C++代碼。

    ???? 第二步:在Matlab中編譯“abhimat.cpp”。啟動Matlab,進入D:\HiMat目錄,在Matlab命令窗口中執行code 2中的命令,根據提示完成C/C++編譯環境的配置。注意:如果你有多個編譯器,建議選擇最新的。

    [plain] view plaincopy print?
  • mex?-setup??
  • mex -setup Code 2,?設置Matlab的C/C++編譯環境

    ???? 完成配置后,在Matlab中執行Code 3的命令來編譯abhimat.cpp。

    [plain] view plaincopy print?
  • mex?abhimat.cpp??
  • mex abhimat.cpp Code 3, 編譯abhimat.cpp

    ????第三步:執行編譯后的C/C++程序。在Matlab命令窗口輸入“abhimat”或者”abhimat()”,都可以調用編譯后的程序,推薦使用后者。

    ???? 細心的讀者已經注意到了:

    • 在Matlab中調用的C/C++函數名就是編譯后以mex*(這里,*表示任意多個字符,例如mexw64)為后綴名的文件名。
    • Matlab執行abhimat()命令后,實際執行的是mexFunction函數中的程序。

    Matlab調用C/C++程序傳遞參數


    ? ??此節我們討論下,在供Matlab調用的C/C++程序中,我們是如何知道Matlab調用的參數類型、個數的。

    ? ??給出Matlab中調用C/C++程序的一個實例,如code 4所示。

    [plain] view plaincopy print?
  • c?=?[1?2;3?4;5?6];??
  • d?=?[1?1;1?1;1?1];??
  • [a,?b]?=?abfunc(c,?d);??
  • c = [1 2;3 4;5 6]; d = [1 1;1 1;1 1]; [a, b] = abfunc(c, d); Code 4,?Matlab調用C/C++程序實例

    ? ??下面的工作是如何在當前目錄下一個命名為abfunc.cpp的文件中實現mexFunction函數。在這個函數中如何獲得Matlab命令中的c、d兩個變量的值,如何返回a、b兩個變量呢。

    ? ??注意mexFunction函數中的四個參數,一一作出說明:

    ? ??nlhs:mexFunction的第一個參數,它指示Matlab的調用命令中等號左側有幾個變量。例如,code 4中的調用,nlhs的值為2,因為它的等號左側有兩個變量,他們是a和b。

    ? ??plhs: mexFunction的第二個參數,它指示Matlab的調用命令中等號左側變量的指針。例如,code 4中的調用,plhs[0]表示的是a,plhs[1]表示的是b。

    ? ??nrhs:mexFunction的第三個參數,它指示Matlab的調用命令中等號右側的變量個數。例如,code 4中的調用,nrhs的值為2,因為它的等號右側有兩個變量,他們是c和d。

    ? ??prhs:mexFunction的第四個參數,它指示Matlab調用命令中等號右側的變量指針。例如,code 4中的調用,prhs[0]表示的是c,prhs[1]表示的是d。

    ? ??mxArrary是一個不可見的數據類型,是Matlab定義的,大家只需要知道mxArrary的指針與Matlab中的變量一一對應就可以了。

    ? ??下面實現abfunc.cpp,功能是a=c+d; b = c-d;具體代碼如code 5所示。

    [cpp] view plaincopy print?
  • #include?"mex.h"??
  • void?mexFunction?(int?nlhs,?mxArray?*plhs[],?int?nrhs,?const?mxArray?*prhs[])??
  • {??
  • ??double?*p_c,?*p_d;??
  • ??double?*p_a,?*p_b;??
  • ??
  • ??int?c_rows,?c_cols;??
  • ??int?d_rows,?d_cols;??
  • ????
  • ??int?numEl;??
  • ??int?n;??
  • ????
  • ??mxAssert(nlhs==2?&&?nrhs==2,?"Error:?number?of?variables");??
  • ??
  • ??c_rows?=?mxGetM(prhs[0]);//?get?rows?of?c??
  • ??c_cols?=?mxGetN(prhs[0]);//?get?cols?of?c??
  • ??d_rows?=?mxGetM(prhs[1]);//?get?rows?of?d??
  • ??d_cols?=?mxGetN(prhs[1]);//?get?cols?of?d??
  • ??
  • ??mxAssert(c_rows==d_rows?&&?c_cols==d_cols,?"Error:?cols?and?rows");??
  • ??
  • ??//?create?output?buffer??
  • ??plhs[0]?=?mxCreateDoubleMatrix(c_rows,?c_cols,?mxREAL);??
  • ??plhs[1]?=?mxCreateDoubleMatrix(c_rows,?c_cols,?mxREAL);??
  • ??
  • ??//?get?buffer?pointers??
  • ??p_a?=?(double*)mxGetData(plhs[0]);??
  • ??p_b?=?(double*)mxGetData(plhs[1]);??
  • ??p_c?=?(double*)mxGetData(prhs[0]);??
  • ??p_d?=?(double*)mxGetData(prhs[1]);??
  • ??
  • ??//?compute?a?=?c?+?d;?b?=?c?-?d;??
  • ??numEl?=?c_rows*c_cols;??
  • ??for?(n?=?0;?n?<?numEl;?n++)??
  • ??{??
  • ????p_a[n]?=?p_c[n]?+?p_d[n];??
  • ????p_b[n]?=?p_c[n]?-?p_d[n];??
  • ??}??
  • }??
  • #include "mex.h" void mexFunction (int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {double *p_c, *p_d;double *p_a, *p_b;int c_rows, c_cols;int d_rows, d_cols;int numEl;int n;mxAssert(nlhs==2 && nrhs==2, "Error: number of variables");c_rows = mxGetM(prhs[0]);// get rows of cc_cols = mxGetN(prhs[0]);// get cols of cd_rows = mxGetM(prhs[1]);// get rows of dd_cols = mxGetN(prhs[1]);// get cols of dmxAssert(c_rows==d_rows && c_cols==d_cols, "Error: cols and rows");// create output bufferplhs[0] = mxCreateDoubleMatrix(c_rows, c_cols, mxREAL);plhs[1] = mxCreateDoubleMatrix(c_rows, c_cols, mxREAL);// get buffer pointersp_a = (double*)mxGetData(plhs[0]);p_b = (double*)mxGetData(plhs[1]);p_c = (double*)mxGetData(prhs[0]);p_d = (double*)mxGetData(prhs[1]);// compute a = c + d; b = c - d;numEl = c_rows*c_cols;for (n = 0; n < numEl; n++){p_a[n] = p_c[n] + p_d[n];p_b[n] = p_c[n] - p_d[n];} } Code 5,??abfunc.cpp的實現

    ? ??說明一下code 5中用到的函數。這些函數大都以mx開頭。mxAssert是斷言,類似于C\C++中的assert。mxGetM獲得Matlab傳來的變量的行數,mxGetN獲得Matlab傳來的變量的列數。mxCreateDoubleMatrix創建一個2維的Matlab變量,形參分別用于指定變量的行數、列數、元素類型(mxREAL表示實數,mxCOMPLEX表示復數)。mxGetData用于獲得內存中數據塊的首地址。

    ? ? 編譯并測試Code 5中的代碼,參見Code 6。

    [plain] view plaincopy print?
  • mex?abfunc.cpp??
  • c?=?[1?2;3?4;5?6];??
  • d?=?[1?1;1?1;1?1];??
  • [a,?b]?=?abfunc(c,?d);??
  • mex abfunc.cpp c = [1 2;3 4;5 6]; d = [1 1;1 1;1 1]; [a, b] = abfunc(c, d); Code 6, Code5的測試代碼

    ? ? Code 6的輸出結果如下:

    [plain] view plaincopy print?
  • a?=??
  • ?????2?????3??
  • ?????4?????5??
  • ?????6?????7??
  • b?=??
  • ?????0?????1??
  • ?????2?????3??
  • ?????4?????5??
  • a =2 34 56 7 b =0 12 34 5


    關于數據存儲的說明

    ? ?Matlab中的數據是按列存儲的。例如,a=[1,2;3,4;5,6],a的數據在內存中的存儲順序是:1、3、5、2、4、6。在C\C++中使用Matlab傳來的變量時,一定要注意數據的存儲順序


    Matlab與C/C++混合編程的方法論

    鑒于@編程小手 的建議,添加一個關于使用此方法的方法論流程圖。希望它能讓各位明白在什么情況下可是使用這種混合編程的技術、如何一步步實現。參見圖1的流程圖:

    圖 1、Matlab與C/C++混編方法論流程圖

    另附:文中代碼下載位置: http://download.csdn.net/detail/bendanban/7643701




    與50位技術專家面對面20年技術見證,附贈技術全景圖

    總結

    以上是生活随笔為你收集整理的C/C++与Matlab混合编程初探的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。