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

vsmatlab混合編程

發布時間: 2022-08-26 13:09:42

❶ 如何脫離MATLAB工作環境,實現MATLAB與Visual Basic語言的混合編程

脫離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工程的程序安裝,就可以解決這種錯誤。

❷ win7 64位系統下VS2008與matlab2010b混合編程問題

不告訴你 ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

❸ vs與matlab混合編程問題

看看這個程序函數main()的
%的主要思想是選擇從兩個圖像信息,然後炒成一個單一的形象。
%這可以從多個被加密(2 * n個)圖像,按照上述思路,獲得圖像的一半的數量(n個)。
%隱藏圖像所獲得的自適應演算法中,並能獲得(N-1)個圖像。
%有關第(n-1)圖像Arnold變換件,(N-1)作為關鍵件的圖像,此外,還有迭代的密鑰號,擾碼規則,阿諾德加密規則
%阿諾德的主要缺點是較大的周期,在程序運行的時間很長,我的電腦需要8分鍾,此外,阿諾德能夠處理方陣
%圖像置亂加密演算法很多這樣的程序中使用的擾碼加密演算法只有一個辦法只有提出的想法多圖像加密,也可以後期做了很多工作。

%閱讀四個圖像
F1 = imread('lena.gif');
F2 = imread('monkey.gif');
F3 = imread('house.gif');
F4 = imread('cameraman.gif');圖像爭先恐後
pic1_luan = luan(F1,F2)的
%;
pic2_luan = luan(F3,F4);

%的顯示失真的圖像
pic1_luan = UINT8(pic1_luan);
身影,imshow(pic1_luan),標題(「PIC1 luan」)的
pic2_luan = UINT8(pic2_luan);
身影,imshow(pic2_luan),標題(「PIC2 luan」),點擊看詳細%兩個炒圖像隱藏
X1 =輸入('請輸入一個混合迭代參數:');
pic1_hide =隱藏(pic1_luan,X1,pic2_luan);圖像被隱藏Arnold置亂加密
diedai1 =輸入('輸入一個迭代的參數:')後


pic1_jiami =阿諾德(pic1_hide,diedai1,0);

%顯示加密圖像
pic1_jiami = UINT8(pic1_jiami);
身影,imshow(pic1_jiami),標題(「PIC1佳米')的
diedai2 =輸入('請輸入一個迭代的參數:')
pic2_jiami =阿諾德(pic2_luan,diedai2,0);

pic2_jiami = UINT8(pic2_jiami);
身影,imshow(pic2_jiami),標題(「PIC2佳米')的
%解密圖像
pic1_jiemi =阿諾德(pic1_jiami,diedai1,1);
pic2_jiemi =阿諾德(pic2_jiami,diedai2,1);隱藏圖像
pic1_huifu =惠福(pic1_jiemi,X1,pic2_jiemi)後

%的回收率;

%爭先恐後逆過程,
恢復後[image1的,IMAGE2] = ni_luan(pic1_huifu)獲得的圖像;
[一系列其他,為image4] = ni_luan(pic2_jiemi);

%顯示每個圖像
F1 = UINT8(F1);
身影,imshow(F1),標題('F1');
身影,imhist(F1),標題(「F1直方圖');

image1的= UINT8(image1的);
身影,imshow(image1的),標題('image1的');
身影,imhist(image1的),標題('image1的直方圖');

F2 = UINT8(F2);
身影,imshow(F2),標題('F2');
身影,imhist(F2),標題(「F2的直方圖');

IMAGE2 = UINT8(IMAGE2);
身影,imshow(IMAGE2),標題(「IMAGE2');
身影,imhist(IMAGE2),標題(「直方圖IMAGE2');

F3 = UINT8(F3);
身影,imshow(F3),標題('F3');
身影,imhist(F3),標題(「F3的直方圖');

一系列其他= UINT8(一系列其他);
身影,imshow(一系列其他),標題(「一系列其他');
身影,imhist(一系列其他),標題(「直方圖的一系列其他');

F4 = UINT8(F4);
身影,imshow(F4),標題('F4');
身影,imhist(F4),標題(「F4的直方圖');

為image4 = UINT8(為image4);
身影,imshow(為image4),標題(「為image4');
身影,imhist(為image4),標題(「為image4直方圖」

❹ VS2008+MATLAB2012混合編程獨立運行

編輯成動態鏈接庫DLL,則都可以調用了,詳細請查看matlab如何生成動態鏈接庫的。同理matlab或任何一個編程軟體幾乎都可調用DLL,一個編程軟體幾乎都可生成DLL,像windows的user32.dll等函數庫,可進行互聯編程,互聯調用,互聯開發!

❺ 請問大神,在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 混合編程,哪種方式最好

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

❼ matlab 與 VC++ 混合編程矩陣傳參

解決方法有三種:
1.卸載vs,安裝較低的版本
2.卸載MATLAB,安裝2013a。
3.我以前看見過一個補丁,具體你去網路之,不過希望不大,我記得他那個解決版本較低的vs和MATLAB,不知道對你這個的兼容性。
ps:給你一個參考,我的混合編程配備是MATLAB2010a+vs2008。
如果有不懂的,可以繼續提問,如果有幫助

熱點內容
帶鎖的鉛筆如何改密碼 發布:2025-02-07 06:18:05 瀏覽:164
ubuntu搭建samba伺服器 發布:2025-02-07 05:52:54 瀏覽:54
小型企業網如何配置可以互通 發布:2025-02-07 05:33:56 瀏覽:243
09年crv哪個配置好 發布:2025-02-07 05:17:31 瀏覽:555
nvm源碼編譯 發布:2025-02-07 05:13:19 瀏覽:126
防偽碼查詢源碼 發布:2025-02-07 05:09:39 瀏覽:769
安卓機的通知在哪裡 發布:2025-02-07 05:09:01 瀏覽:282
密碼74是什麼意思 發布:2025-02-07 05:02:10 瀏覽:47
蘋果es瀏覽器無法連接ftp 發布:2025-02-07 04:59:57 瀏覽:285
javaa和a 發布:2025-02-07 04:58:24 瀏覽:64