最近在學習混合編程的相關知識,閑話不說,直接進入主題。
本系列實驗基於MATLAB2010b 和VS2010 的平台,32位win7電腦。
調用MATLAB加法程序add.m,步驟如下。
(1)打開MATLAB2010b,出現如下界面。

(2)創建函數文件add.m,並編寫程序如下。

注意:m文件存放的位置,程序中指定的MATLAB當前工作路徑相匹配。
在本實驗中MATLAB的默認當前工作路徑為C:\Program Files\MATLAB\R2010b.
(3)打開VS2010軟件,並建立一個空的控制台程序工程。如下圖所示。

注意:工程項目中主文件可以是.c文件也可以是.cpp文件,如果是.c文件,則所有變量的聲明,必須放在程序的最前面,否則會出現編譯錯誤。
(4)設置C語言環境。
這里主要有三個地方需要設置。右鍵選擇項目的屬性,彈出窗口如下圖所示。

a) 選中VC++目錄,設置包含目錄為:
C:\Program Files\MATLAB\R2010b\extern\include
b)選中VC++目錄,設置庫目錄為:
C:\Program Files\MATLAB\R2010b\extern\lib\win32\microsoft
c)選中鏈接器菜單下的輸入選項,添加附加依賴項。
libeng.lib、libmx.lib、libmat.lib、libmex.lib.
這四個庫文件對應着我們使用的四類函數:MATLAB引擎相關函數、mxArray相關函數、mat文件相關函數、mex相關函數,對應的頭文件為:engine.h、matrix.h、mat.h、mex.h
注意:設置編譯環境庫目錄時,也可以在鏈接器常規下面的附加庫目錄里設置,只對本項目有效(經過驗證,兩者的效果是一樣的,網上解釋說:前者是針對所有的,后者只是針對C/C++編譯器的,所以如果只用到了該編譯器,則效果是相同的)。另外,需要增加windows系統的path環境變量:
C:\Program Files\MATLAB\R2010b\bin\win32,具體設置參見網上教程。設置之后,重啟電腦,並在DOS命令框里輸入ECHO %PATH%查看是否設置成功,結果如下圖所示。

(5)編寫主程序如下。
#include <stdio.h>
#include <stdlib.h>
/******加載MATLAB相關函數運行所需頭文件********/
#include <engine.h>
#include <matrix.h>
#include <mat.h>
#include <mex.h>
//主程序入口
void main()
{
Engine *ep = engOpen(NULL); //打開精簡版MATLAB
mxArray *a = mxCreateDoubleMatrix(1,1,mxREAL); //創建mxArray類型變量
mxArray *b = mxCreateDoubleMatrix(1,1,mxREAL);
double *aval = (double *)mxCalloc(1, sizeof(double)); //申請靜態存儲空間
double *bval = (double *)mxCalloc(1, sizeof(double));
aval[0] = 1;
bval[0] = 2;
mxFree(mxGetPr(a)); //使用mxSetPr函數前,必須先釋放空間
mxSetPr(a, aval);
mxFree(mxGetPr(b));
mxSetPr(b, bval);
flag =engEvalString(ep, "cd ./work"); //向MATLAB發送字符串命令
//修改工作路徑
engPutVariable(ep, "a", a); //將變量傳入到MATLAB空間中
engPutVariable(ep, "b", b);
engEvalString(ep, "s=add(a,b);"); //求和
engEvalString(ep, "save test.mat;"); //保存所有變量
mxArray *s = engGetVariable(ep, "s"); //將MATLAB變量傳回VS空間
printf("s=%f", *mxGetPr(s)); //打印結果
engClose(ep); //關閉精簡版MATLAB
mxDestroyArray(a); //釋放mxArray變量
mxDestroyArray(b);
system("PAUSE"); //屏幕暫留
}
(6)結果如下圖所示。

