當前位置:首頁 » 編程軟體 » vcmatlab混合編程

vcmatlab混合編程

發布時間: 2023-05-26 22:51:41

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

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

⑵ matlab混合編程怎麼設置環境

脫離MATLAB工作環境,實現MATLAB與VisualBasic語言的混合編程

以下討論是在MATLAB7.0軟體和vc++6.0軟體環境中進行:
一、將MATLAB的.m文件編譯成.exe文件,實現MATLAB與Visual Basic語言的混合編程
1、將 \MATLAB7\toolbox\compiler\deploy\matlabrc.m 中的81行 set_param(0,'PaperType',defaultpaper)
和82行set_param(0,'PaperUnits',defaultunits)
注釋掉,或者乾脆刪掉,否則,在沒有安裝MATLAB的機子上運行MATLAB與VisualBasic語鏈世培言混合編成的程序時,會出現:「Undefinedcommand/function 'set_param'」的錯誤。
2、在Matlab7 的命令窗口運行下列命令:rehash toolboxcache
完成工具箱載入和更新。
3、在Matlab7 的命令窗口運棚唯行下列命令:
Mcc –m ***.m
將MATLAB的.m文件(M文件必須以Function開始,即必須是函數文件)編譯成.exe文件,將編譯生成的.ctf文件和.exe文件拷貝到VB工程的目錄中,他們是脫離matlab環境運行必返雀需的文件;
4、在VB工程中用下列語句對MATLAB的.m文件編譯成的.exe文件進行調用:
lTask = Shell("rt2.exe",vbHide)
hProc= OpenProcess(PROCESS_QUERY_INFORMATION, False, lTask)
IflTask = 0 Then MsgBox "程序執行失敗"
Do
GetExitCodeProcess hProc, lExit
DoEvents
LoopWhile lExit = STILL_ACTIVE
5、將VB工程進行打包,打包時,要將在MATLAB中編譯生成的.ctf文件和.exe文件添加到VB工程包中,他們是脫離matlab環境運行必需的文件;
6、將打包好的VB工程安裝包拷貝到客戶計算機中,並將matlab7\toolbox\compiler\deploy\win32下的MCRInstaller.exe程序也一起拷貝到客戶計算機中。
7、在客戶計算機中,運行程序:MCRInstaller.exe,將matlab compiler runtime安裝到客戶計算機中。注意:安裝目錄必須位於它所在的文件夾
8、運行VB工程安裝包中的setup程序,進行VB工程的程序安裝;
至此,在客戶機中,即可正常運行MATLAB與Visual Basic語言混合編成的程序。
注意事項:
1、在VB工程所在目錄中,不能有其它的.dll文件存在,否則在客戶機中運行MATLAB與Visual Basic語言混合編成的程序時,會出現下列錯誤提示:
「Warning:Failed to startthe Java Virtual machine.」
「Warning:Disabling Javasupport.」
「Undefined function orvariable 『matlabrc』.」
二、將MATLAB的.m文件編譯成.dll文件,實現MATLAB與Visual Basic語言的混合編程
1、將 \MATLAB7\toolbox\compiler\deploy\matlabrc.m 中的81行 set_param(0,'PaperType',defaultpaper)
和82行set_param(0,'PaperUnits',defaultunits)
注釋掉,或者乾脆刪掉,否則,在客戶機中運行MATLAB與Visual Basic語言混合編成的程序時,會出現:「Undefined command/function 'set_param'」的錯誤。
2、在Matlab7 的命令窗口運行下列命令:rehash toolboxcache
完成工具箱載入和更新。
3、安裝vc++6.0軟體,為Matlab編譯器的安裝和配置做准備;
4、在Matlab7 的命令窗口運行下列命令:
mbuild –setup
對Matlab的編譯器進行安裝和配置;
5、在Matlab中創建COM組件
用Matlab COM生成器創建COM組件,包括4個步驟,即創建工程、管理m文件、生成組件、打包和分發組件。
在Matlab中創建COM組件步驟如下:
(1) 創建工程。在Matlab命令窗中鍵入comtool命令,調用Matlab編譯器,打開Matlab COM Build主窗口。在該窗口中,選擇File→New Project,創建一個新的工程,在此對話框中對新工程進行設置,輸入組件名和類名,選擇合適的編譯器。
(2) 管理m文件。單擊「AddFile」按鈕,添加編寫好的M函數文件(M文件必須以Function開始,即必須是函數文件)。
(3) 生成組件。使用Build--àCom object菜單,創建COM組件,將MATLAB的.m文件編譯成.dll文件。
(4)打包和分發組件:編譯成功並通過測試後,就可以把有關文件打包和分發給目標器。單擊 「Component」→」Package Component」,創建自解壓可執行程序。注意:在使用Component--àPackageComponent菜單,生成.exe文件時,要將「includeMCR」前的選擇框選中,使生成的.exe文件中能包含MCRInstaller.exe程序。
6、將編譯生成的.ctf文件和.dll文件以及.exe文件拷貝到VB工程的目錄中;
7、創建VB工程並調用COM組件新建「標准EXE」工程,進入VB編程環境,在「工程」菜單中單擊「引用」選項, 在列表中選中第5步中生成的這些組件,以及添加MWComUtil 7.0 Type Library,單擊「確定」按鈕。
在VB工程引用這些組件後,需按照以下步驟來調用Matlab文件:
Dim rt2 As rt2_1.rt2_1class '聲明一個COM組件
Set rt2 = New rt2_1.rt2_1class
Call rt2.rt2 '執行rt2_1_1_0.dll文件
8、將VB工程進行打包,打包時,要將在MATLAB中編譯生成的.ctf文件和.dll文件以及.exe添加到VB工程包中;
9、在客戶計算機中,運行第5步中生成的.exe程序,對第5步中生成的.dll動態鏈接庫進行注冊,並自動運行MCRInstaller.exe程序,將matlab compiler runtime安裝到客戶計算機中。
10、將打包好的VB工程安裝包拷貝到客戶計算機中,運行VB工程安裝包中的setup程序,進行VB工程的程序安裝;
至此,在客戶機中,即可正常運行MATLAB與Visual Basic語言混合編成的程序。
注意事項:
1、VB編譯生成的MATLAB與Visual Basic語言混合編成的exe應用程序不能簡單的移植,必須要打包,在打包時應帶上dll文件,然後將打包好的VB工程安裝包拷貝到客戶機中,運行VB工程安裝包中的setup.exe安裝程序,進行VB工程的安裝,VB工程安裝完成後,再在客戶機中,運行第5步中生成的.exe程序,就可以避免出現下列各種錯誤提示:
(1)「Warning:Failedto start the Java Virtualmachine.」
「Warning:Disabling Javasupport.」
「Undefined function orvariable 『matlabrc』.」
(2)「Automation錯誤」或者「自動化錯誤」
(3)「運行時錯誤』429』:ActiveX部件不能創建對象」
(4)「MCR instance isnot available.」
2、在VB工程所在目錄中,除了包含第5步中生成的.dll動態鏈接庫文件外,不能有其它的.dll文件存在,否則在客戶機中運行MATLAB與Visual Basic語言混合編成的程序時,會出現下列錯誤提示:
「Warning:Failed to startthe Java Virtual machine.」
「Warning:Disabling Javasupport.」
「Undefined function orvariable 『matlabrc』.」
3、如果直接將Vb工程程序拷貝到客戶機中,而不是通過安裝Vb工程程序,來運行MATLAB與VisualBasic語言混合編成的程序時,會出現:「Automation錯誤」或者「自動化錯誤」的錯誤提示,這時可以通過下列方法之一解決:
(1)在客戶機中運行第5步中生成的.exe程序,對第5步中生成的.dll動態鏈接庫進行注冊,就可以解決「Automation錯誤」或者「自動化錯誤」引起的程序運行異常。
(2)在客戶機中直接運行regsvr32.exe程序,對第5步中生成的.dll動態鏈接庫進行注冊,也可以解決「Automation錯誤」或者「自動化錯誤」引起的程序運行異常。
4、如果在客戶機中,沒有運行第5步中生成的.exe程序,對第5步中生成的.dll動態鏈接庫進行注冊,那麼在客戶機中運行MATLAB與Visual Basic語言混合編成的程序時,就會出現:「運行時錯誤』429』:ActiveX部件不能創建對象」的提示,或者出現:「Automation錯誤」或者「自動化錯誤」的錯誤提示。
5、如果在客戶機中運行MATLAB與Visual Basic語言混合編成的程序時,出現:「MCR instance isnot available.」的錯誤提示時,可以通過將打包好的VB工程安裝包拷貝到客戶計算機中,運行VB工程安裝包中的setup程序,進行VB工程的程序安裝,就可以解決這種錯誤。

⑶ 在vc++中利用com實現與matlab混編問題,急!!

如果是matlab6.5和vc6.0編寫的話扒碧,可以直接用mbuild -setup按吵鉛照提示選擇VC的編譯器,完成後在Matlab命令窗口中輸入春碰舉:mex -setup,具體網上有,這樣做也挺簡單的

⑷ C++Builder與Matlab混合編程的實現

在C++Builder中調用Matlab工具箱函數,有兩種實現方式。一種是基於Matlab環境支持,通過必要的設置實現;筆者在本刊上曾撰文對這種方式進行了專門的闡述。另一種則是完全脫離Matlab環境,通過動態連接庫方式實現對Matlab工具箱函數的調用,這可以通過一種開發平台Mediva來實現。相對來說,前者的限制因素較多,而後者則較為方便靈活。

一、Mediva軟體平台

Mediva是Mathtools公司推出的一種Matlab編譯開發軟體平台,提供對Matlab程序文件(M文件)的解釋執行和開發環境支持。該軟體有為Borland C++、Visual Basic和Dephi等編程語言開發的不同版本,目前其版本已經到了4.5版。軟體大小僅6.5M,可以通過訪問其站點www.mathtools.com免費下載試用一個月。 Mediva軟體平台本身的功能相當強大,提供近千個Matlab的基本功能函數,通過必要的設置,就可以直接實現與C++的混合編程,而不必再依賴Matlab;同時,Mediva還提供編譯轉換功能,能夠將Matlab函數或編寫的Matlab程序轉換為C++形式的DLL,從而實現脫離Matlab環境對Matlab函數和過程的有效調用,這樣就有可能實現對Matlab強大的工具箱函數的利用。

Mediva的缺點是C++與Matlab混合編寫的應用軟體必須攜帶必要的DLL,從而增大了軟體的體積(約4M),同時也不能對所有的Matlab函數提供支持,例如採用類庫進行設計的部分函數。但盡管如此,對於控制系統計算機設計、分析的工作來說,Mediva仍不失為一個好的工具。

由於利用Mediva將Matlab工具箱函數轉換成DLL的內容較多,限於篇幅本文在此僅給出對Matlab函數直接調用的實現,而將另撰文闡述DLL的實現。

二、C++Builder直接調用Matlab函數

本文假設已經安裝了Mediva軟體或已經得到必要的兩個動態連接庫mdv4300.dll和ago4300.dll。

Mediva提供的近千個Matlab基本功能函數,都可以在C++Builder中直接調用。這些函數包括基物畝本的操作、命令、I/O、線性代數、點陣圖、控制等,基本上可以滿足我們的一般需要。當然其的優點就是可以直接在C++Buider中直接調用而不必耐螞手考慮安裝龐大的Matlab。

其實現方式和步驟如下:

1.Lib文件的生成

在Dos下用C++Builder中的Implib.exe,通過如下命令生成mdv4300.lib: implib mdv4300.lib mdv4300.dll

將上述兩個DLL文件和此Lib文件拷貝到當前目錄下。

2.實現與Matlab的混合編程

Matlab.h包含了Mediva中昌嫌所有類型、常量、函數的說明和定義,必須將此頭文件放於程序的第一行。Mediva給出的Matlab函數形式並不特殊,如繪線函數Plot,在Mediva中說明為:Mm DLLI plot(cMm varargin);varargin與Matlab 中的意義是一樣的,與輸入變數的個數相對應。所有可以直接使用的函數都在Matlib.h頭文件中定義,而在mdv4300.dll中實現。

但在C++Builder中使用Mediva提供的Matlab函數的格式,與Matlab編程稍有不同,這主要體現在C++中必須進行必要的說明上。例如我們要用繪線函數Plot來繪制數組x[100]的紅色圖線。在Matlab中調用為Plot(x,'r');在C++中調用則為:Plot(CL(x),TM("r")),其中CL是一個關鍵字,是多變數輸入時所必須使用的,用以指明調用的變數;而TM則指明,這是一個字元。

下面我們給出一個示常式序,其功能是對一個1024點的輸入數組進行FFT 變換,並繪制變換後頻譜實部的火柴桿圖,最後將原數據和變換後的數據寫入數據文件中。

#include "matlib.h"

//必須包含的頭文件

#include vcl.h >

#pragma hdrstop

#include "TryMatcomU.h"

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

__fastcall TForm1::TForm1(Tcomponent* Owner)

: Tform(Owner)

{

}

void __fastcall TForm1::Button1Click(Tobject *Sender)

{
int k=0;
initM(MATCOM_VERSION); //必須進行的初始化
Mm cur1,cur2; //定義變數
cur1=zeros(128); cur2=zeros(128); //變數初始化
for(k=1;k< =128;k++)
cur1.r(k)=randM(); //生成一個隨機數列
figure(1);
plot(cur1);//圖形顯示該數列
cur2=fft(cur1,128); //做128點fft變換
figure(2); //繪制fft變換後實部的火柴桿圖,注意此處多變數輸入的格式
stem((CL(cur1),real(cur2),TM("r")));
fid=fopen(filename,mode,format) opens
exitM(); //退出調用
}

如果完全使用C++來實現本程序的工作,其代碼將超過300行!由此可以看出,C++Builder與Matlab函數的混合編程可以給我們帶來多麼大的方便!

⑸ 關於matlab與vc混合編程

nargout是輸出參數,改:

isOK=mlfSignal(0,&y); 為:

isOK=mlfSignal(1,&y);

試試吧。。

⑹ VC和matlab混合編程,將一個多行矩陣載入matlab中,結果和我放進去的不符合啊

我好想在哪見過說mxArray的賦值不要用,matlab庫裡面都提供尺晌相應函數的,你用下面的語句試試
第一句換成:mxArray * traindata;
memcpy句換成:mlfAssign(&traindata, mlfDoubleMatrix(5,4,data1,NULL));
我都是用matlab6.5跟譽困歷vc6.0的,因為你沒說清楚matlab版本,不知道上面的行不行,你查下網慶搜上應該有對應版本該用哪個函數

⑺ 請問大神,在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();
}

⑻ 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工液磨程選項,然後操作就很簡單了。

⑼ matlab與c混合編程,engOpen()的問題,matlab引擎啟動不了

使用engOpen()打開Matlab引擎總是失敗,問題可能就是Matlab組件沒有注冊。注冊方法:點擊開始/運行/cmd,在命令行提示窗口下更改到Matlab安裝路徑/bin,運行指令
matlab/regserver,注冊成功後會彈出Matlab 命令窗口。

⑽ matlab 2012b與VC++2012混合編程怎麼搞

產生這樣的問題的原因往往是MATLAB的版本比visual studio的版本要低,所以他搜不到vs。(別看你是2012b了)解決方法有三種旅型:
1.卸載vs,安裝較低的版本
2.卸載MATLAB,安裝2013a。
3.我以前看見過一個補丁,具體你爛或去網路之,不過希望不大,我記得他那個解決版本較低的vs和MATLAB,不知道對你這個的兼容性。
ps:給你一個參考,我的混合編程配備是MATLAB2010a+vs2008。
如果有不懂的,可以繼續提問,如果有幫助,望採納。拆歷猜

熱點內容
我的世界租賃伺服器會被封ip嗎 發布:2025-02-14 03:46:05 瀏覽:982
資料庫附 發布:2025-02-14 03:44:43 瀏覽:837
安卓系統解不了鎖怎麼辦 發布:2025-02-14 03:44:35 瀏覽:552
怎麼查詢信用卡密碼 發布:2025-02-14 03:42:04 瀏覽:318
studio外貿服裝直播腳本 發布:2025-02-14 03:34:16 瀏覽:453
python集合運算符 發布:2025-02-14 03:06:18 瀏覽:205
pic編譯軟體 發布:2025-02-14 03:01:04 瀏覽:984
反編譯在編譯 發布:2025-02-14 02:55:36 瀏覽:418
python列印對象 發布:2025-02-14 02:51:20 瀏覽:573
QRM演算法 發布:2025-02-14 02:45:19 瀏覽:266