VC調用MATLAB


最近項目要用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");
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM