最近項目要用VC調用MATLAB,今天閒來無事,在這裏稍微總結了一下初級的用法,你們共同窗習;函數
首先在MATLAB Command Window裏輸入mbuild -setup,一步步走學習
還有一個mex -setup;和上邊相似,就很少說了;測試
寫MATLAB函數:ui
function [sum,prod] = sumandcheng(p1,p2)
sum = p1+p2; % p1 與 p2 的和
prod = p1.*p2;
end字符串
上邊函數計算p1和p2的和與積,寫它的目的爲了測試VC和MATLAB相互傳輸數據;input
在MATLAB串口輸入:mcc -W cpplib:plotsintest -T link:lib sumandcheng.m;string
等一會生成了plotsintest.lib,plotsintest.h,plotsintest.dll文件,後邊要用,把他們拷到你的VC工程目錄下;it
function [outs] = stringout(inputs)io
outs=inputs;
endfunction
這個函數直接輸出輸入的參數,寫它的目的爲了測試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");}