最近項目要用VC調用MATLAB,今天閑來無事,在這里稍微總結了一下初級的用法,大家共同學習;
首先在MATLAB Command Window里輸入mbuild -setup,一步步走
還有一個mex -setup;和上邊類似,就不多說了;
寫MATLAB函數:
function [sum,prod] = sumandcheng(p1,p2)
sum = p1+p2; % p1 與 p2 的和
prod = p1.*p2;
end
上邊函數計算p1和p2的和與積,寫它的目的為了測試VC和MATLAB相互傳輸數據;
在MATLAB串口輸入:mcc -W cpplib:plotsintest -T link:lib sumandcheng.m;
等一會生成了plotsintest.lib,plotsintest.h,plotsintest.dll文件,后邊要用,把他們拷到你的VC工程目錄下;
function [outs] = stringout(inputs)
outs=inputs;
end
這個函數直接輸出輸入的參數,寫它的目的為了測試VC和MATLAB相互傳輸字符串;
同上:mcc -W cpplib:stringtest -T link:lib stringout.m
生成那三個文件stringtest.lib,stringtest.h,stringtest.dll,同樣拷到VC工程目錄下;
二.VC6.0里設置
1. Project->setting->Link->Object/library modules:加入mclmcrrt.lib和用MATLAB生成的.lib文件;這里用了plotsintest.lib,stringtest.lib;
2.Tools->Options->Directories->Show directories for->include files加入MATLAB的安裝路徑,例如我D:\ProgramFiles\MATLAB\R2010a\extern\include;接着在Show directories for下的Library files加入D:\ProgramFiles\MATLAB\R2010a\extern\lib\win32\microsoft;
3.加入頭文件#include "plotsintest.h",#include "stringtest.h";
4.以下是VC源代碼
#include <string.h>
#include <stdlib.h>
#include "plotsintest.h"
#include "stringtest.h"
//***********************以下內容從網上COPY的,不過重加了一遍注釋*************************//
void display(const double* data, const int r, const int c, const char* name);
int main()
{
if (! plotsintestInitialize() )
{
fprintf(stderr,"Could not initialize the library.\n");
exit(1);
}
double x[] = {1,2,3,4,5,6};//初始化輸入序列x;
double y[] = {7,8,9,10,11,12};//初始化輸入序列y
//因為MATLAB里生成dll文件時用的mcc -W cpplib:stringtest -T link:lib stringout.m
//所以輸入參數必需為mwArray類型;;
mwArray X(2,3,mxDOUBLE_CLASS);//定義輸入X;
mwArray Y(2,3,mxDOUBLE_CLASS);//定義輸入Y;
X.SetData(x,6);//將x賦值給X;
Y.SetData(y,6);//將y賦值給Y;
mwArray SUM,PROD;//定義輸出mwArray變量;
sumandcheng(2,SUM,PROD,X,Y) ;//2表示輸出參數個數,緊接着為輸出參數和輸入參數
//定義輸出VC++類型參數,
double *sum,*prod;
sum = new double[6];
prod = new double[6];
//取出mwArray型數據並賦值給VC++變量
SUM.GetData(sum,6);
PROD.GetData(prod,6);
//打印出來
display(sum,2,3,"SUM");
display(prod,2,3,"PROD");
delete sum;
delete prod;
plotsintestTerminate();
//***********************以下內容為自己寫的*****************************//
stringtestInitialize();//看到沒,生成的stringtest 加上Initialize,表示初始化;
char strintemp[15]="Hello,World";//定義字符串;
mwArray intstr(strintemp);//把字符串轉換為mwArray類型;
mwArray outstr;//定義輸出字符串;
stringout(1,outstr,intstr);//調用MATLAB函數,1表示輸出一個變量,緊跟着是輸出變量和輸入變量;
mwString strouttemp=outstr.ToString();//將MATLAB函數輸出的mwArray變量換為mwString類型;
char *c = strdup((const char *)strouttemp);//把mwString類型轉換為char型;
printf("%s\n",c);
stringtestTerminate();//這個就不解釋了吧!
return 0;
}
//當然底下這個子函數也是從網上盪來的和上邊是一塊的;
void display(const double* data, const int r, const int c, const char* name)
{
int i,j;
printf("%s = \n",name);
for(i=0;i<r;i++)
{
printf("\t");
for(j=0;j<c;j++)
printf("% 4.2f \t",data[j*r+i]);
printf("\n");
}
printf("\n");
}