<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://www.jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://www.jackxiang.com/post//</link>
<title><![CDATA[Matlab与VB集成]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Fri, 08 May 2009 06:13:34 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	工业生产中经常遇到复杂的数据信息处理问题，需要大运算量的矩阵计算及对分析结果进行实时、直观的图形化显示。Matlab是集数值分析、矩阵运算、信号处理和图形显示于一体的高性能数学软件，将其强大的计算功能与VB在图形用户界面开发方面的优势结合起来，实现应用系统的无缝集成，对于有效缩短开发周期、优化系统性能是十分有意义的。下面将分别讨论Matlab与VB集成的四种方法。 <br/>一、借助 ActiveX部件 <br/>Microsoft把所有以COM为基础的技术统称为ActiveX技术。自动化是大多数ActiveX技术的基础，它可使解释性的宏语言（如VB）能够在不了解应用程序实现细节的情况下控制自动化对象。Matlab实现了ActiveX自动化服务支持，在VB下通过ActiveX自动化接口可将Matlab作为Visual Basic语言的一个ActiveX部件调用。 <br/>Matlab ActiveX自动化服务的功能主要包括在Matlab工作空间执行Matlab命令，以及直接从工作空间存取矩阵等，下面列出了Matlab自动化服务支持的几个主要方法，其参数和返回值的类型采用ActiveX自动化协议所定义的与语言无关的类型描述: <br/>● BSTR Execute([in] BSTR Command); <br/>BSTR表示宽字符串类型，它与VB存储字符串所采用的数据格式相同。该方法接收字符串命令并在Matlab中执行，将结果以字符串形式返回。 <br/>● void GetFullMatrix([in] BSTR Name，[in] BSTR Workspace，[in, out] SAFEARRAY(double)* pr，[in, out] SAFEARRAY(double)* pi); <br/>该方法从指定的工作空间检索一个完整的一维或二维的实型或虚mxArray，其实部和虚部被分别存放到两个单独的Double型数组中。 <br/>● void PutFullMatrix([in] BSTR Name，[in] BSTR Workspace，[in] SAFEARRAY(double) pr，[in] SAFEARRAY(double) pi); <br/>该方法将一个mxArray放入指定的工作空间。各参数的含义及调用方法与GetFullMatrix方法类似。 <br/>示例代码如下： <br/>Dim Matlab As Object ’声明对象 <br/>Dim MReal1(5，5) As Double&nbsp;&nbsp;<br/>’声明存放实部的Double型数组 <br/>Dim MImag() As Double&nbsp;&nbsp;<br/>’声明存放虚部的Double型数组 <br/>Set Matlab=CreateObject(“Matlab.Application”) ’初始化对象 <br/>Matlab.Execute(“a=hilb(5)”)&nbsp;&nbsp;<br/>’执行Matlab命令 <br/>Call Matlab.GetFullMatrix(“a”,“base”，MReal1，MImag)&nbsp;&nbsp;<br/>’将结果分别存入实部、虚部数组 <br/>二、借助DDE技术 <br/>DDE(Dynamic Data Exchange)允许Microsoft Windows应用程序通过交换数据实现彼此间的通信。应用程序间彼此通信要先建立一个DDE会话，对会话进行初始化的应用程序称为客户端（Client），对Client端作出响应的应用程序称为服务器（Server）。图1描述了Matlab作为服务器时与其他应用程序的通信机制。 <br/><br/>图1 借助DDE时应用程序通信机制 <br/>图1 借助DDE时应用程序通信机制 <br/>其中，DDE功能函数既可以由应用程序提供，也可以由Matlab引擎库提供。 <br/>初始化会话时，客户端应用程序必须指定两个参数service name(服务器应用程序的名称)和topic（会话主题）。 <br/>下面的示例说明了VB与Matlab建立并完成DDE会话的全过程： <br/>说明: TextInput是输入文本框，TextOutput是输出文本框。在TextInput中输入Matlab命令回车后，由Matlab在后台执行并将结果返回给TextOutput显示。 <br/>Sub TextInput_KeyPress(KeyAscii As Integer) <br/>If KeyAscii = vbKeyReturn then <br/>’初始化TextInput与Matlab间的DDE会话&nbsp;&nbsp;<br/>TextInput.LinkMode = vbLinkNone <br/>TextInput.LinkTopic = “MATLABEngine” <br/>TextInput.LinkItem =“EngEvalString” <br/>TextInput.LinkMode = vbLinkManual <br/>szCommand = TextInput.Text <br/>’执行Matlab命令 <br/>TextInput.LinkExecute szCommand <br/>TextInput.LinkMode = vbLinkNone <br/>’初始化TextOutput与Matlab间的DDE会话 <br/>TextOutput.LinkMode = vbLinkNone <br/>TextOutput.LinkTopic = “MATLABEngine” <br/>TextOutput.LinkItem =“EngStringResult” <br/>TextOutput.LinkMode = vbLinkManual <br/>’返回执行结果并显示 <br/>TextOutput.LinkRequest <br/>TextOutput.LinkMode = vbLinkNone <br/>End If <br/>End Sub <br/>三、通过M文件 <br/>Matlab产生的M文件不能直接在VB中调用,可利用mcc将M文件直接编译成.EXE文件，然后在VB中声明下面三个API函数，最后使用Shell命令即可实现VB与Matlab的无缝集成。 <br/>1. 用mcc生成独立的外部应用程序。可使用如下两种命令： <br/>mcc -p file.m 或 mcc -m file.m <br/>2. 在VB中声明调用的三个API函数:&nbsp;&nbsp;<br/>● Declare Function WaitForSingleObject Lib “kernel32”(ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long <br/>● Declare Function CloseHandle Lib “kernel32”(ByVal hObject As Long) As Long <br/>● Declare Function OpenProcess Lib “kernel32”(ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long,ByVal dwProcessId As Long) As Long <br/>3. 示例代码:&nbsp;&nbsp;<br/>Dim lTask As Long, lret As Long, lHandle As Long <br/>’执行file.exe文件 <br/>lTask = Shell(“file.exe”, vbNormalFocus) <br/>lHandle = OpenProcess(SYNCHRONIZE, False, lTask) <br/>’等待进程执行完毕 <br/>lret = WaitForSingleObject(lHandle, INFINITE) <br/>lret = CloseHandle(lHandle) <br/>’ file.exe文件执行完毕后，继续执行应用程序 <br/>…… <br/>通过以上编码，应用程序可以在执行过程中调用.EXE完成特定的计算或图形功能后，再继续其执行过程，从而实现与Matlab的集成。 <br/>四、引入MatrixVB <br/>MatrixVB是MathWorks针对VB提供的一个Matlab库，它提供了600多个函数，包括基本的数学运算和功能强大的信号处理、线性代数、串运算及图形图像处理功能等，为VB提供了强大的功能扩展。在VB中使用该数学工具包可避免重复性劳动，从而减少开发人员实现算法和界面设计的困难。 <br/>MatrixVB是一个独立的产品（可以从www.mathworks.com得到），其使用十分方便。MatrixVB安装完成后，只需在VB工程中引用Mmatrix即可。 <br/>示例代码如下： <br/>说明: 工业生产中经常需要对采集到的原始信号进行分析，并对分析结果进行实时的图形化显示，下面通过在VB中引用Mmatrix来实现这一功能。代码如下:&nbsp;&nbsp;<br/>Dim ax as Variant ’声明坐标轴 <br/>Private Sub Form_Resize() <br/>vbrefresh ax ’刷新坐标轴 <br/>End Sub <br/>Private Sub Form_Load() <br/>ax = vbaxes(Form1.hWnd)&nbsp;&nbsp;<br/>’将坐标轴置于窗体 <br/>Call Form_Resize <br/>End Sub <br/>Private Sub Command1-Click() <br/>Dim I，C As Matrix ’声明向量 <br/>Dim m As Integer <br/>’从数据库中取原始信号存入一维向量I，取其对应的碳含量存入一维向量C <br/>’m为向量I、C的元素个数 <br/>Call Icheck ( I , C , m )&nbsp;&nbsp;<br/>’调用校正函数 <br/>End Sub <br/>Private Sub Icheck (I As Variant, C As Variant, ByVal m As Integer) <br/>Dim II，CC，Z As Matrix <br/>Dim a0，a1，a2 As Double <br/>II = zeros(m，1) <br/>CC = zeros(m，1) <br/>II(colon(1，m)) = I(colon(1，m)) <br/>CC(colon(1，m)) =C(colon(1，m)) <br/>’多项式拟和求解&nbsp;&nbsp;<br/>Z = polyfit ( II, CC, 2 )&nbsp;&nbsp;<br/>’2 说明用二项式拟和 <br/>a0= Z.r1(1) ’a0为二次项系数 <br/>a1= Z.r1(2) ’a1为一次项系数 <br/>a2= Z.r1(3) ’a2为0次项系数 <br/>Clear axes ’清除坐标轴 <br/>T = Sort ( II )&nbsp;&nbsp;<br/>’对原始信号排序，以确定作图区间 <br/>J = Linspace (T(1).r1(1)，T(1).r(m)，20)&nbsp;&nbsp;<br/>’横坐标向量 <br/>Cuv = plus (plus (times (a0，times (X，X) ),&nbsp;&nbsp;<br/>times (a1，X) )，a2) ’纵坐标向量 <br/>Tmp = plot (J，Cuv) ’绘制曲线 <br/>Hold (“on”) <br/>Tmp = plot (II, CC，“r.”) ’绘制点 <br/>Hold (“off”) <br/>End Sub <br/>执行以上代码，结果如图2所示： <br/><br/>总 结 <br/>以上几种方法对于Matlab与VB的集成都是行之有效的，但在实际应用中究竟采用哪一种方式应视具体情况而定。前两种方式比较适合Client/Server模式，后两种方式则应视应用系统的具体要求来做选择，相比较而言，借助M文件在执行效率上略高一筹，而引入MatrixVB在使用上更为方便。总而言之，Matlab与VB集成可大大提高开发效率，对于解决工程问题是十分有意义的。 <br/>
]]>
</description>
</item><item>
<link>http://www.jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] Matlab与VB集成]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>