標籤:matlab dll c 混合編程
VC與Matlab混合編程之調用動態連結程式庫dll——<二>
1、是先建立 matlab 的 m 檔案。
ellipsefit.m
其包含:function [Xc,Yc,A,B,Phi,P]=ellipsefit(x,y)
2.MCC命令編譯產生得到h、dll、lib等檔案
在matlab命令列中輸入:
mcc -B csharedlib:ellipsefit ellipsefit.m (此方式為c風格函數)
(具體命令含義可參考《精通matlab與C/C++混合程式設計》劉維,第3版,北京航空航天大學出版社。)
(ellipsefit是產生的lib檔案名稱,可以隨意命名。ellipsefit.m是想調用的.m檔案名稱。
至此,可以發現在ellipsefit.m所在的目錄產生了一系列檔案。我們將要使用:ellipsefit.h, ellipsefit.dll, ellipsefit.lib
2.3:建立一個 VC 工程:test
為了簡單,我們在這裡建立一個win32控制台程式。如下:
然後,將上面這3個檔案(ellipsefit.h, ellipsefit.dll, ellipsefit.lib
)拷貝到VC工程所在的目錄中,以便VC調用之,並將.h檔案加入到工程中。
2.3 VC 編程:(代碼如下 )
// test.cpp : 定義控制台應用程式的進入點。//#include "stdafx.h"#include<vector>#include<iostream>#include<fstream>/********************************VC調用mcc產生的dll************************************/#include "mclmcrrt.h"#include "mclmcr.h"#include "mclcppclass.h"#include "matrix.h"// include lib head file#include "ellipsefit.h"// link matlab sys lib#pragma comment(lib, "mclmcrrt.lib")#pragma comment(lib, "libmx.lib")#pragma comment(lib, "libmat.lib")#pragma comment(lib, "mclmcr.lib")// link lib#pragma comment(lib, "ellipsefit.lib")using namespace std;bool readFile(vector<double> &vec_in, ifstream &infile){ double temp; while(infile>>temp) vec_in.push_back(temp); return true;}bool ellipsefit_dll(double &Xc,double &Yc,double &A,double &B,double &Phi,double &P,vector<double> x,vector<double> y){ mxArray *mxa_x, *mxa_y; mxArray *mxa_Xc = NULL,*mxa_Yc = NULL,*mxa_A = NULL,*mxa_B = NULL,*mxa_Phi = NULL,*mxa_P = NULL; mxa_x = mxCreateDoubleMatrix(x.size(),1 , mxREAL); mxa_y = mxCreateDoubleMatrix(y.size(),1 , mxREAL); memcpy(mxGetPr(mxa_x),&x[0], y.size()*sizeof(double)); memcpy(mxGetPr(mxa_y),&y[0], y.size()*sizeof(double));//OK //memcpy(mxGetPr(mxa_x),&x.at(0), y.size()*sizeof(double)); //memcpy(mxGetPr(mxa_y),&y.at(0), y.size()*sizeof(double));//OK //memcpy(mxGetPr(mxa_x),(void*)&(*x.begin()), y.size()*sizeof(double)); //memcpy(mxGetPr(mxa_y),(void*)&(*y.begin()), y.size()*sizeof(double));//OK //copy(x.begin(),x.end(),mxGetPr(mxa_x)); //copy(y.begin(),y.end(),mxGetPr(mxa_y));//OK //mxSetPr(mxa_x,&x[0]); //mxSetPr(mxa_y,&y[0]);//OK,但是不能釋放記憶體空間 mlfEllipsefit(6, &mxa_Xc,&mxa_Yc,&mxa_A,&mxa_B,&mxa_Phi,&mxa_P, mxa_x, mxa_y); mxDestroyArray(mxa_x); mxDestroyArray(mxa_y); double *p_Xc = mxGetPr(mxa_Xc);// 將 matlab 中的矩陣的指標傳遞給 C 語言中的指向 double 的指標 Xc=p_Xc[0]; double *p_Yc =mxGetPr(mxa_Yc); Yc = p_Yc[0]; double *p_A =mxGetPr(mxa_A); A = p_A[0]; double *p_B =mxGetPr(mxa_B); B = p_B[0]; double *p_Phi =mxGetPr(mxa_Phi); Phi = p_Phi[0]; double *p_P =mxGetPr(mxa_P); P = p_P[0]; return true;}int main(int argc, _TCHAR* argv[]){ if (!mclInitializeApplication(NULL, 0)) { cout << "Could not initialize the application."<< endl;; } if (!ellipsefitInitialize()) { cout << "Can‘t Initalize!" << endl; } cout << "開始運行" << endl; ifstream infile_x,infile_y; char *infile_name_x="x.txt"; char *infile_name_y="y.txt"; infile_x.open(infile_name_x); vector<double> vec_x; readFile(vec_x,infile_x); infile_y.open(infile_name_y); vector<double> vec_y; readFile(vec_y,infile_y); double Xc,Yc,A,B,Phi,P; ellipsefit_dll(Xc,Yc,A,B,Phi,P,vec_x,vec_y); cout<<"Xc="<<Xc<<endl; cout<<"Yc="<<Yc<<endl; cout<<"A="<<A<<endl; cout<<"B="<<B<<endl; cout<<"Phi="<<Phi<<endl; cout<<"P="<<P<<endl; ellipsefitTerminate(); mclTerminateApplication(); system("pause"); return 0;}
運行結果:x64下
VC調用matlab dll方式混合編程(c風格--例2)<二>