matlab調用C語言

一、首先要熟悉matlab所附帶的C語言api 
1、定義mexFunction函數,mexFunction的定義法唯一: 它只能是如下形式: 
void mexFunction( int nlhs, mxArray *plhs[],int nrhs, const mxArray *prhs[] ) 
其名稱和參數類型不許有任何改變,在mexFunciton函數中可以調用你剛定義好的C++程序。

2、MATFile matOpen(const char *filename, const char mode)——打開/創建

3、MATFile matOpen(const char *filename, const char mode)——打開/創建一個MAT文件;

4、int matClose(MATFile *pMF)——關閉一個MAT文件;

5、mxArray *mxCreateDoubleMatrix(int m, int n, mxComplexity flag) ——創建一個(復)雙精度矩陣;

6、`mxArray *mxCreateSparse(int m, int n, int nzmax,mxComplexity flag) ——創建一個稀疏矩陣;

7、mxArray *matGetNextArray(MATFile *pMF)——獲得MAT文件裏面下一個矩陣;

8、const char *mxGetName(const mxArray *pa)——獲得矩陣pa的名稱;

9、void mxSetName(mxArray *pa,const char *s)——爲矩陣pa設置一個名稱;

10、int mxGetM(const mxArray *pa)——獲得矩陣pa的總行數;

11、int mxGetN(const mxArray *pa)——獲得矩陣pa的總列數;

12、double *mxGetPr(const mxArray *pa)——獲得矩陣pa的pr指針;

13、int *mxGetIr(const mxArray *pa)——獲得稀疏矩陣pa的ir指針;

14、int *mxGetJc(const mxArray *pa)——獲得稀疏矩陣pa的jc指針;

15、int matPutArray(MATFile * pMF, const mxArray * pA) ——把矩陣pA存儲入MAT文件pMAF;

16、void mxDestroyArray(mxArray *pa)——釋放矩陣pa(把它從內存中撤銷);

二、例子(用C++模擬matlab矩陣相加add.cpp)

#include "mex.h" 
#include<stdlib.h>
#include <string.h>
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
	double *inData1, *inData2, *outData;
	int inM1, inN1, inM2, inN2, outM, outN, i, j;
	//檢查輸入參數矩陣的個數
	if (nrhs != 2)
		mexErrMsgTxt("輸入參數必須爲2!");

	else if (nlhs > 2)
		mexErrMsgTxt("Too many output arguments");
	//獲取輸入矩陣的行列
	inM1 = mxGetM(prhs[0]);
	inN1 = mxGetN(prhs[0]);
	inM2 = mxGetM(prhs[1]);
	inN2 = mxGetN(prhs[1]);
	outM = (inM1 > inM2) ? inM1 : inM2;
	outN = (inN1 > inN2) ? inN1 : inN2;
     mexPrintf("輸出行數爲:%d\n",outM);
      mexPrintf("輸出列數爲:%d\n",outN);
	//創建輸出矩陣
	plhs[0] = mxCreateDoubleMatrix(outM, outN, mxREAL);
	//獲得輸入,輸出的頭指針
	inData1 = mxGetPr(prhs[0]);
	inData2 = mxGetPr(prhs[1]);
	outData = mxGetPr(plhs[0]);

	//創建二維數組
	double **temp1, **temp2,**answer1,**answer2;
    
	temp1 = (double **)malloc(sizeof(double *) * inM1);
	for (i = 0; i < inM1; i++)
		temp1[i] = (double *)malloc(sizeof(double) * inN1);

	temp2 = (double **)malloc(sizeof(double *) * inM2);
	for (i = 0; i < inM2; i++)
		temp2[i] = (double *)malloc(sizeof(double) * inN2);
    
    answer1 = (double **)malloc(sizeof(double *) * outM);
	for (i = 0; i < outM; i++)
	answer1[i] = (double *)malloc(sizeof(double) * outN);
    
   answer2 = (double **)malloc(sizeof(double *) * outM);
	for (i = 0; i < outM; i++)
	answer2[i] = (double *)malloc(sizeof(double) * outN);
    //標準answer1初賦值爲0
    for ( i = 0; i < outM; i++)
		for (int j = 0; j < outN; j++)
			answer1[i][j]=0;
   for ( i = 0; i < outM; i++)
		for (int j = 0; j < outN; j++)
			answer2[i][j]=0;
    
	//temp一維變二維	 
	for ( i = 0; i < inM1; i++)
		for (int j = 0; j < inN1; j++)
			temp1[i][j] = inData1[j*inM1 + i];
	//temp2一維變二維
     for (i = 0; i < inM2; i++)
	   for ( j = 0; j < inN2; j++)
		temp2[i][j] = inData2[j*inM2 +i];   

    //temp1二維擴展至標準	 
     {
      for ( i = 0; i < inM1; i++)
	    for ( j = 0; j <inN1; j++)
			 answer1[i][j] = temp1[i][j];
	}
     //temp2二維擴展至標準	 
     {
      for ( i = 0; i < inM2; i++)
	    for ( j = 0; j <inN2; j++)
			 answer2[i][j] = temp2[i][j];
	}

//標準格式相加,結果輸入到answer1
     for (i = 0; i < outM; i++)
	{
    
		for (j = 0; j < outN; j++)
			 answer1[i][j]= answer1[i][j]+ answer2[i][j];
		
	}
      mexPrintf("\n");
     
	//釋放小數組temp1
	for ( i = 0; i < inM1; i++)
	{
		free(temp1[i]);
	}
	free(temp1);
	//釋放小數組temp2
	for ( i = 0; i < inM2; i++)
	{
		free(temp2[i]);
	}
	free(temp2);
    
  
    
    //釋放大數組answer2
	for ( i = 0; i < outM; i++)
	{
		free(answer2[i]);
	}
	free(answer2);


//二維轉一維輸出!!
 
for (i = 0; i < outM; i++)
    for (j = 0; j < outN; j++)
    {
	outData[j*outM+i] =answer1[i][j];

    }
 // 釋放大數組answer1
	for ( i = 0; i < outM; i++)
	{
		free(answer1[i]);
	}
	free(answer1);
}


三、編譯 
將add.c拷貝至Matlab當前目錄,執行mex add.cpp,生成add.mexw64,該文件實現求和功能。此時便可在Matlab中調用該函數


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章