?? mathtools594.txt
字號:
發信人: FangQ (木頭蟲子), 信區: MathTools
標 題: Matlab與C++接口與混合編程討論小結(五)
發信站: BBS 水木清華站 (Tue Nov 2 22:27:13 1999)
第二章、
第三節、用c編寫mex程序[三]
BBS水木清華站∶精華區
發信人: fasiondog (亂了), 信區: MathTools
標 題: 用c編寫mex程序 [part 3] (轉信)
發信站: BBS 水木清華站 (Sun Apr 4 10:59:00 1999)
發信人: dodoo (虛懷), 信區: Programming
標 題: 用C編寫mex程序 [PART 3]
分析hello.c,可以看到程序的結構是十分簡單的,整個程序由一個接口子過程
mexFunction構成。前面提到過,Matlab的mex函數有一定的接口規范,就是指這
nlhs:輸出參數數目
plhs:指向輸出參數的指針
nrhs:輸入參數數目
例如,使用 [a,b =test(c,d,e) 調用mex函數test時,傳給test的這四個參數分別是2,
plhs,3,prhs。其中:
prhs[0]=c
prhs[1]=d
prhs[2]=e
prhs[2]=e
prhs[2]=e
當函數返回時,將會把你放在plhs[0],plhs[1]里的地址賦給a和b,達到返回數據的目
的。
細心的你也許已經注意到,prhs[i]和plhs[i]都是指向類型mxArray類型數據的指針。
這個類型是在mex.h中定義的,事實上,在Matlab里大多數數據都是以這種類型存在。當
然還有其他的數據類型,可以參考Apiguide.pdf里的介紹。
為了讓大家能更直觀地了解參數傳遞的過程,我們把hello.c改寫一下,使它能根據輸
入參數的變化給出不同的屏幕輸出:
//hello.c 2.0
#include "mex.h"
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
int i;
i=mxGetScalar(prhs[0]);
if(i==1)
mexPrintf("hello,world!\n");
else
mexPrintf("大家好!\n");
}
}
將這個程序編譯通過后,執行hello(1),屏幕上會打出:
hello,world!
而hello(0)將會得到:
大家好!
現在,程序hello已經可以根據輸入參數來給出相應的屏幕輸出。在這個程序里,除了用
到了屏幕輸出函數mexPrintf(用法跟c里的printf函數幾乎完全一樣)外,還用到了一
個函數:mxGetScalar,調用方式如下:
i=mxGetScalar(prhs[0]);
"Scalar"就是標量的意思。在Matlab里數據都是以數組的形式存在的,mxGetScalar的
作用就是把通過prhs[0]傳遞進來的mxArray類型的指針指向的數據(標量)賦給C程序里
的變量。這個變量本來應該是double類型的,通過強制類型轉換賦給了整形變量i。
既然有標量,顯然還應該有矢量,否則矩陣就沒法傳了。看下面的程序:
//hello.c 2.1
//hello.c 2.1
#include "mex.h"
void mexFunction(int nlhs, mxArray *plhs[],
int nrhs, const mxArray *prhs[])
{
int *i;
i=mxGetPr(prhs[0]);
if(i[0]==1)
mexPrintf("hello,world!\n");
else
mexPrintf("大家好!\n");
}
這樣,就通過mxGetPr函數從指向mxArray類型數據的prhs[0]獲得了指向double類型的
指針。
但是,還有個問題,如果輸入的不是單個的數據,而是向量或矩陣,那該怎么處理呢
?通過mxGetPr只能得到指向這個矩陣的指針,如果我們不知道這個矩陣的確切大小,就
沒法對它進行計算。
為了解決這個問題,Matlab提供了兩個函數mxGetM和mxGetN來獲得傳進來參數的行數
和列數。下面例程的功能很簡單,就是獲得輸入的矩陣,把它在屏幕上顯示出來:
//show.c 1.0
#include "mex.h"
#include "mex.h"
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
double *data;
int M,N;
int i,j;
data=mxGetPr(prhs[0]); //獲得指向矩陣的指針
M=mxGetM(prhs[0]); //獲得矩陣的行數
N=mxGetN(prhs[0]); //獲得矩陣的列數
for(i=0;i<M;i++)
{
for(j=0;j<N;j++)
mexPrintf("%4.3f ",data[j*M+i]);
mexPrintf("\n");
mexPrintf("\n");
}
}
}
編譯完成后,用下面的命令測試一下:
a=1:10;
b=[a;a+1];
show(a)
show(b)
需要注意的是,在Matlab里,矩陣第一行是從1開始的,而在C語言中,第一行的序數
為零,Matlab里的矩陣元素b(i,j)在傳遞到C中的一維數組大data后對應于data[j*M+i] 。
--
這 是 最 后 的 斗 爭
THIS IS THE FINAL CONFLICT
※ 來源:·BBS 水木清華站 bbs.net.tsinghua.edu.cn·[FROM: 202.115.15.64]
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -