導航:首頁 > 編程語言 > matlab和vc混合編程

matlab和vc混合編程

發布時間:2023-01-26 23:13:49

A. vc++ matlab混合編程 fsolve

這個可以有四種方法實現:
(1)將Matlab程序編譯成 C/C++源文件並嵌入VC++;
(2)在C/C++程序中利用 Matlab engine調用 Matlab函數;
(3)在C/C++程序中直接使用 Matlab C/C++ Math Library;
(4)將.m文件編譯成 *.dll文件嵌入到 VC++的程序中。
自己上網查一下。

不過告訴你一個簡單的,在matlab的工作窗口執行:
mbuild -setup

按提示操作
然後執行
met -setup
完成後,到VC裡面,應該會出現met工程選項,然後操作就很簡單了。

B. matlab VC混合編程調用神經網路工具箱

調用MATLAB Engine雖然可以實現對神經網路工具箱的功能,但是因為這種方法是基於C/S模式的,效率很低,而且需要在matlab下實現其功能,無法脫離matlab直接運行,所以,基於這個原因,我放棄了利用MATLAB Engine來實現混合編程。利用C++數學庫雖然可以脫離MATLAB直接運行,但是C++數學庫並不支持神經網路工具箱,所以,無法實現基於神經網路的混合編程。利用mcc命令雖然可以直接生成.exe文件,並可以脫離MATLAB在VC++中直接運行,但是因為其自身的諸多缺點,這種方法並不能編譯神經網路函數為C++文件,所以,也無法勝任這個任務。 最後,只有COM組件這一個辦法了,由於COM組件技術的強大功能,利用matlab的COM Builder工具可以實現脫離matlab的混合編程,並成功的調用了神經網路工具箱。

C. 請問大神,在VC++和matlab混合編程中,結構體如何轉換成mwArray形式的

1. VC調用Matlab Engine的方式:
Matlab Engine是一組Matlab提供的介面函數,支持C/C++語言,Matlab Engine採用C/S(客戶機/伺服器)模式,Matlab作為後台伺服器,而C/C++程序作為前台客戶機,向Matlab Engine傳遞執行命令和數據信息,從Matlab Engine接收執行結果。用戶可以在前台應用程序中調用這些介面函數,實現對Matlab Engine的控制。採用這種方法幾乎能利用Matlab全部功能,但是需要在機器上安裝Matlab軟體,缺點是執行效率較低。下面簡單介紹下這種方式的實現步驟:
1.1 API介面介紹
先來介紹一組Matlab提供的引擎API介面:(僅作簡單功能介紹,詳細參數說明請參考Matlab幫助)
Engine* engOpen(const char* startcmd)啟動Matlab引擎
int engClose(Engine* ep) 關閉Matlab引擎
int engEvalString(Engine* ep, const char* string)執行Matlab表達式
mxArray* engGetArray(Engine* ep, const char* name)獲取一個變數數組的值
int engPutArray(engine* ep, const mxArray* mp)設置一個變數數組的值
int engPutVariable(Engine *ep, const char *name, const mxArray *pm)同上
mxArray *engGetVariable(Engine *ep, const char *name)獲取一個變數
int engOutputBuffer(Engine* eP,char* p,int n)獲取輸出字元串

1.2 VC環境配置
要想在VC集成環境下調用Matlab引擎實現VC和Matlab的混合編程,一般需要經過以下幾個必要的步驟:(以下以Matlab2008a和VS2005版本為例)
(1)添加include路徑:將「\extern\include」(在Matlab的安裝路徑下)路勁添加到VC編譯器的include下
(2)添加lib路徑:將「\extern \lib\win32\microsoft」 (在Matlab的安裝路徑下) 路徑添加到VC編譯器的lib下
(3)載入lib:需要載入至少libmx.lib、libmat.lib、libeng.lib三個庫
(4)include頭文件:在要使用 engine 函數的地方包含engine.h頭文件

1.3 引擎調用
接下來就可以在VC中調用Matlab引擎了,簡單的示例代碼如下:

#include "engine.h"

#pragma comment(lib, "libeng.lib")
#pragma comment(lib, "libmx.lib")
#pragma comment(lib, "libmat.lib")

void TestDeno()
{
Engine* pEng = NULL;
if (!(pEng = engOpen(NULL)))
{
printf("Open matlab enging fail!");
return;
}

//call Engine plot A*sin(t)+B A=2 B=1

mxArray *A = NULL;

double init = 2;
A = mxCreateDoubleMatrix(1, 1, mxREAL);
memcpy((void*) mxGetPr(A), (void*)&init, sizeof (double));
engPutVariable(pEng, "A", A);

init = 1;
memcpy((void*) mxGetPr(A), (void*)&init, sizeof (double));
engPutVariable(pEng, "B", A);

mxDestroyArray(A);

Sleep(3*60*1000);

engEvalString(pEng, "t=0:0.2:7;plot(t,A*sin(t)+B);");

if(NULL != pEng)
{
engClose(pEng);
}
}

示例代碼通過VC調用Matlab引擎,繪制正弦曲線,相對簡單,就不再詳細解釋,效圖如下:

2. VC調用Matlab DLL的方式
DLL是一個可執行的二進制文件。把很多通用的功能放在DLL中,可以供各種應用程序調用,這樣可以很好的減少外部存儲空間的佔有量,並實現代碼的共享。Matlab也支持將m程序編譯成dll,供其他語言(包括VC、VB、Fortran等)調用,下面先簡單介紹下Matlab DLL的編譯步驟:
2.1 Matlab DLL製作
(1)配置Matlab的編譯器跟,要將mex和mbuil兩個都配置成本機上安裝的VC,mbuild的配置方法同mex
(2)編譯m函數成為dll,在matlab命令空間中使用mcc命令編譯m文件:(mcc的使用參考Matlab幫助)
示例:將一個Matlab函數MyFun 編譯成libMyFun 的命令:
mcc –W cpplib:libMyFun –T link:lib MyFun
參數說明:-W控制編譯之後的封裝格式,cpplib表示c++的lib,冒號之後是編譯輸出lib名,-T表示目標,link:lib表示連接到lib的目標,MyFun是待編譯的m文件名,編譯成功之後,會輸出三個文件:libMyFun.lib libMyFun.dll libMyFun.h

2.2 DLL在VC中調用
要想在VC集成環境下調用Matlab的DLL,實現VC和Matlab的混合編程,一般需要經過以下幾個必要的步驟:(以下以Matlab2008a和VS2005版本為例)
(1)VC環境配置,同前面VC調用Matlab引擎方式類似,也需要配置VC的編譯環境,其中include路徑、lib路徑和前一種方式相同,載入的lib變更為:mclmcrrt.lib、libmx.lib、libmat.lib、mclmcr.lib四個,include的頭文件變更為:mclmcr.h、matrix.h、mclcppclass.h三個。
(2)DLL中函數的調用,先看一下m函數編譯成C++Dll之後的函數聲明,例:matlab函數:function [y, out] = CaculateFun(x, in)編譯之後對應c++的聲明:void MW_CALL_CONVCaculateFun(int nargout, mwArray& y, mwArray& out, const mwArray& x, const mwArray& in)參數int nargout指定調用時,輸出參數的個數,緊跟的後續nargout個參數y、out為輸出參數,後續再剩下的多個參數x、in就為輸入參數。
(3)注意事項:在VC中調用dll中的函數之前,需要先調用函數libFunInitialize初始化,在調用完函數以後,需要再調用函數libFunTerminate和mclTerminateApplication終止。
准備好了上述步驟,就可以在VC中調用DLL中函數的了,簡單的示例代碼如下:

// include matlab sys head file
#include "mclmcr.h"
#include "matrix.h"
#include "mclcppclass.h"

// include lib head file
#include "libCaculateFun.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, "libCaculateFun.lib")

void TestDeno()
{
// init lib
if (!(libCaculateFunInitialize()))
{
std::cout<<"Could not init lib !"<<endl;
return -1;
}

double xxxx[2] = {0};
double inin = 0;

double yyyy[2] = {0};
double outo = 0;

// 為函數參數分配內存空間
mwArray mwXX(1, 2, mxDOUBLE_CLASS);
mwArray mwIn(1, 1, mxDOUBLE_CLASS);

mwArray mwYY(1, 2, mxDOUBLE_CLASS);
mwArray mwOut(1, 2, mxDOUBLE_CLASS);

// 為輸入參數賦值
mwXX.SetData(&xxxx, 2);
mwIn.SetData(&inin, 1);

// 調用計算函數
CaculateFun(2, mwYY, mwOut, mwXX, mwIn);

// 獲取輸出參數
outo = mwOut.Get(1, 1);

// lib Terminate
libCaculateFunTerminate();

// MCR Terminate
mclTerminateApplication();
}

D. Matlab 與 VC 混合編程

該書已經出到第二版,即使從這個角度講,也能看出作者對編寫該書的認真程度。該書第一版在2005年出版,是國內較早介紹matlab與C++混合編程的書籍之一。
如果您要購買,請購買第二版,因為不同版本所依託的matlab的版本也是不同的。

E. vc matlab 混合編程,哪種方式最好

調用matlab引擎:是要求MATLAB作為VC的一個後台來調用,從本質來說還是在MATLAB中運行的程序;
基於matcom:可以脫離MATLAB的環境,但是貌似有一部分MATLBA中的函數不能完全調用;而且方法簡單;
基於COM的:這個我不太會也沒有試過;
我推薦將MATLAB的程序編譯成動態庫在VC中調用,這也可以完全脫離MATLAB的環境,可以完美調用

閱讀全文

與matlab和vc混合編程相關的資料

熱點內容
文件夾圖標如何改成公會logo 瀏覽:973
怎樣創建job文件夾 瀏覽:831
介紹單片機外設的書籍推薦 瀏覽:56
通達信雙柱擒牛指標源碼 瀏覽:467
內存太大解壓失敗怎麼辦 瀏覽:441
linuxmakefile解析 瀏覽:777
單片機原理與應用李林功 瀏覽:39
pythonorm框架有哪些 瀏覽:431
indesign轉pdf 瀏覽:483
javaweb找源碼 瀏覽:26
浪潮物理伺服器如何重啟 瀏覽:602
aes加密性能下降 瀏覽:449
linux驅動結構 瀏覽:868
psv安裝壓縮包 瀏覽:613
錦州聯通DNS伺服器地址 瀏覽:115
伺服器佔用太多的網路怎麼辦 瀏覽:936
設置ftp共享文件夾win10 瀏覽:793
伺服器和主機是什麼意思 瀏覽:638
自製透明收納文件夾 瀏覽:164
testflight怎麼下載安卓軟體 瀏覽:180