vb與matlab混合編程
『壹』 vb.net2010與matlab聯合編程的問題。
這個混合編程有多種方式,關鍵是怎麼來連接。
目前常用的方法有:
1)dll動態鏈接庫
2)VB 利用shell () 函數調用MATLAB 應用程序
3)動態數據交換(DDE)
4)ActiveX自動化服務技術
其中,
1)可以脫離matlab系統,但是需要注冊該dll文件。運行速度較快。
2)中程序的運行脫離不了MA TLAB 環境, 無法開發出獨立的可執行程序,難以用於商業目的。
3)其實是把matlab當做vb的一個客戶端,進行數據交換,這明顯不能脫離matlab系統。
4)中所編制的程序並沒有脫離MA TLAB 環境, 需要在機器上安裝好MA TLAB 系統。
『貳』 matlab 和VB如何結合的
一、藉助 ActiveX部件
沒什麼好說的
二、藉助DDE技術
DDE(Dynamic Data Exchange)允許Microsoft Windows應用程序通過交換數據實現彼
此間的通信。類似於C/S模型
三、通過M文件
Matlab產生的M文件不能直接在VB中調用,可利用mcc將M文件直接編譯成.EXE文件,
然後在VB中聲明傳說中的三個API函數,最後使用Shell命令即可實現VB與Matlab的無縫集
成。
四、引入MatrixVB
MatrixVB是MathWorks針對VB提供的一個Matlab庫,為VB提供了強大的功能擴展。在VB中使用該數學工具包可避免重復性勞動,從而減少開發人員實現演算法和界面設計的困難。
具體的怎麼實現,不是一兩句話講得明白的,最關鍵的是你一分都不給啊!^_^
(其實,按我上面說的關鍵字,網上搜一下一大堆!)
『叄』 怎樣在VB6.0調用MATLAB
大概有四種方法可以實現:1.藉助ActiveX組件。需要先從MATLAB客戶端創建ActiveX控制項。可以使用圖形用戶界面或之間使用命令actxcontrol函數。2.藉助DDE技術。以MATLAB作為伺服器端。3.通過M文件。先用mcc將M文件直接編譯成exe文件,然後在VB中聲明幾個API函數。4.引入matrix。即針對VB的MATLAB庫。
『肆』 用VB或者MATLAB在一個矩形內生成一個固定點和幾個隨機點,再求出從固定點經過所有隨機點回來後的最短路徑
這個並非一般的最短路徑問題,而是旅行商問題(Traveling Saleman Problem,TSP)。旅行商問題屬於NP完全問題,如果問題規模比較大,至今沒有太有效的演算法。
這里提供一個蟻群演算法的程序,參考:
http://..com/question/175608123.html
根據你的問題做了少量改動,具體代碼如下:
functionTSP
%TSP旅行商問題
%設置初始參數如下:
m=10;Alpha=1;Beta=5;Rho=0.1;NC_max=200;Q=100;
%生成隨機點,第一個點視為固定點
C=[0.50.5];
C(2:10,:)=rand(9,2);
%調用蟻群演算法求解
[R_best,L_best,L_ave,Shortest_Route,Shortest_Length]=ACATSP(C,NC_max,m,Alpha,Beta,Rho,Q);
function[R_best,L_best,L_ave,Shortest_Route,Shortest_Length]=ACATSP(C,NC_max,m,Alpha,Beta,Rho,Q)
%%=========================================================================
%%ACATSP.m
%%
%%ChengAihua,,ZhengZhou,China
%%Email:[email protected]
%%Allrightsreserved
%%-------------------------------------------------------------------------
%%主要符號說明
%%Cn個城市的坐標,n×2的矩陣
%%NC_max最大迭代次數
%%m螞蟻個數
%%Alpha表徵信息素重要程度的參數
%%Beta表徵啟發式因子重要程度的參數
%%Rho信息素蒸發系數
%%Q信息素增加強度系數
%%R_best各代最佳路線
%%L_best各代最佳路線的長度
%%=========================================================================
%%第一步:變數初始化
n=size(C,1);%n表示問題的規模(城市個數)
D=zeros(n,n);%D表示完全圖的賦權鄰接矩陣
fori=1:n
forj=1:n
ifi~=j
D(i,j)=((C(i,1)-C(j,1))^2+(C(i,2)-C(j,2))^2)^0.5;
else
D(i,j)=eps;
end
D(j,i)=D(i,j);
end
end
Eta=1./D;%Eta為啟發因子,這里設為距離的倒數
Tau=ones(n,n);%Tau為信息素矩陣
Tabu=zeros(m,n);%存儲並記錄路徑的生成
NC=1;%迭代計數器
R_best=zeros(NC_max,n);%各代最佳路線
L_best=inf.*ones(NC_max,1);%各代最佳路線的長度
L_ave=zeros(NC_max,1);%各代路線的平均長度
whileNC<=NC_max%停止條件之一:達到最大迭代次數
%%第二步:將m只螞蟻放到n個城市上
Randpos=[];
fori=1:(ceil(m/n))
Randpos=[Randpos,randperm(n)];
end
Tabu(:,1)=(Randpos(1,1:m))';
%%第三步:m只螞蟻按概率函數選擇下一座城市,完成各自的周遊
forj=2:n
fori=1:m
visited=Tabu(i,1:(j-1));%已訪問的城市
J=zeros(1,(n-j+1));%待訪問的城市
P=J;%待訪問城市的選擇概率分布
Jc=1;
fork=1:n
iflength(find(visited==k))==0
J(Jc)=k;
Jc=Jc+1;
end
end
%下面計算待選城市的概率分布
fork=1:length(J)
P(k)=(Tau(visited(end),J(k))^Alpha)*(Eta(visited(end),J(k))^Beta);
end
P=P/(sum(P));
%按概率原則選取下一個城市
Pcum=cumsum(P);
Select=find(Pcum>=rand);
to_visit=J(Select(1));
Tabu(i,j)=to_visit;
end
end
ifNC>=2
Tabu(1,:)=R_best(NC-1,:);
end
%%第四步:記錄本次迭代最佳路線
L=zeros(m,1);
fori=1:m
R=Tabu(i,:);
forj=1:(n-1)
L(i)=L(i)+D(R(j),R(j+1));
end
L(i)=L(i)+D(R(1),R(n));
end
L_best(NC)=min(L);
pos=find(L==L_best(NC));
R_best(NC,:)=Tabu(pos(1),:);
L_ave(NC)=mean(L);
NC=NC+1
%%第五步:更新信息素
Delta_Tau=zeros(n,n);
fori=1:m
forj=1:(n-1)
Delta_Tau(Tabu(i,j),Tabu(i,j+1))=Delta_Tau(Tabu(i,j),Tabu(i,j+1))+Q/L(i);
end
Delta_Tau(Tabu(i,n),Tabu(i,1))=Delta_Tau(Tabu(i,n),Tabu(i,1))+Q/L(i);
end
Tau=(1-Rho).*Tau+Delta_Tau;
%%第六步:禁忌表清零
Tabu=zeros(m,n);
end
%%第七步:輸出結果
Pos=find(L_best==min(L_best));
Shortest_Route=R_best(Pos(1),:)
Shortest_Length=L_best(Pos(1))
%繪圖顯示結果
clf
subplot(1,2,1)
DrawRoute(C,Shortest_Route)
subplot(1,2,2)
plot(L_best)
holdon
plot(L_ave)
functionDrawRoute(C,R)
%%=========================================================================
%%DrawRoute.m
%%畫路線圖的子函數
%%-------------------------------------------------------------------------
%%CCoordinate節點坐標,由一個N×2的矩陣存儲
%%RRoute路線
%%=========================================================================
%原來的繪圖語句太繁瑣,改用這一句就可以了
plot(C([RR(1)],1),C([RR(1)],2),'o-')
%標明固定點
holdon
plot(C(1,1),C(1,2),'ro')
由於點是隨機生成的,每次運行的結果都不同,下面是某次運行的結果(紅點為固定點)。
『伍』 vb.net調用matlab
Matlab產生的M文件不能直接在VB中調用,可利用mcc將M文件直接編譯成.EXE文件,然後在VB中聲明下面三個API函數,最後使用Shell命令即可實現VB與Matlab的無縫集成。
1. 用mcc生成獨立的外部應用程序。可使用如下兩種命令:
mcc -p file.m 或 mcc -m file.m
2. 在VB中聲明調用的三個API函數:
● Declare Function WaitForSingleObject Lib 「kernel32」(ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
● Declare Function CloseHandle Lib 「kernel32」(ByVal hObject As Long) As Long
● Declare Function OpenProcess Lib 「kernel32」(ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long,ByVal dwProcessId As Long) As Long
3. 示例代碼:
Dim lTask As Long, lret As Long, lHandle As Long
』執行file.exe文件
lTask = Shell(「file.exe」, vbNormalFocus)
lHandle = OpenProcess(SYNCHRONIZE, False, lTask)
』等待進程執行完畢
lret = WaitForSingleObject(lHandle, INFINITE)
lret = CloseHandle(lHandle)
』 file.exe文件執行完畢後,繼續執行應用程序
……
通過以上編碼,應用程序可以在執行過程中調用.EXE完成特定的計算或圖形功能後,再繼續其執行過程,從而實現與Matlab的集成。