程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> Matlab調用C程序

Matlab調用C程序

編輯:關於C語言

Matlab調用C程序


Matlab是矩陣語言,如果運算可以用矩陣實現,其運算速度非常快。但若運算中涉及到大量循環,Matlab的速度令人難以忍受的。當必須使用for循環且找不到對應的矩陣運算來等效時,可以將耗時長的函數用C語言實現,並編譯成Mex文件,Matlab便可以像調用內建函數一樣調用C編寫的函數。Mex文件其實是一種動態鏈接庫,舊版本Matlab可以直接調用.dll,新版本要調用.mexw32或.mexw64文件。

編譯過程需要C語言編譯器,在Matlab中鍵入mex –setup進行安裝與配置。

MEX文件的源代碼組成

(1)功能子程序。該過程包含了Mex文件實現計算功能的代碼,是標准的C語言子程序。

(2)入口子程序。該過程提供功能子程序與Matlab之間的接口,以mexFunction函數實現。注意,入口過程的名稱必須是mexFunction,並且包含四個參數,即

void mexFunction(int nlhs,mxArray*plhs[],int nrhs,const mxArray *prhs[]);

nrhs(left hand side): 輸入參數的個數;

prhs是一個輸入數組,其內容為指針,指向mxArray類型的數據(MATLAB中所有數據都是以矩陣的形式mxArray保存的)。

nlhs, plhs含義類似。

具體地,若在Matlab中執行[a,b]=test(c,d,e) ,則nlhs=2, nrhs=3,prhs[0]指向c,prhs[1]指向d,prhs[2]指向e(可以理解為:prhs[0]=&c, prhs[1]=&d, prhs[2]=&e),注意prhs是const指針數組,故不能改變其指向內容;函數返回時將plhs[0],plhs[1]指向的內容賦給a,b(可以理解為a=*plhs[0], b=*plhs[1])。

 

:新建add.c,源碼如下:

#include mex.h  
double add(double x, double y)
{
    return x + y;
} 
void mexFunction(int nlhs,mxArray *plhs[], int nrhs,const mxArray *prhs[])
{
    double *a;
    double b, c;
    plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);
    a = mxGetPr(plhs[0]);
    b = *(mxGetPr(prhs[0]));
    c = *(mxGetPr(prhs[1]));
    *a = add(b, c);
}
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved