搜档网
当前位置:搜档网 › Matlab与VB_NET混合编程中数据存储方式的研究

Matlab与VB_NET混合编程中数据存储方式的研究

Matlab与VB_NET混合编程中数据存储方式的研究
Matlab与VB_NET混合编程中数据存储方式的研究

2008 2009,30

(8)0引言

Matlab 是科学计算和工程应用的常用工具,它内置大量的函数,可以方便的用于各种数学运算。https://www.sodocs.net/doc/f99805726.html, 是一种简单易学、功能强大的程序设计语言。使用这两种工具混合编程可以利用各自的优点,减少程序开发时间,提高程序的计算能力和易用性,编写出适合各种需要的应用程序。

在我们实验室开发的SUNIST 单粒子模拟系统中,由于需要进行大量的矩阵计算,同时需要对这些计算结果进行分析和应用,所以我们使用Matlab R2007b 和https://www.sodocs.net/doc/f99805726.html, 2005作为程序开发工具。其中,使用Matlab R2007b 进行矩阵计算,使用https://www.sodocs.net/doc/f99805726.html, 2005设计人机界面、管理模拟结果。在SUNIST 单粒子模拟系统中,Matlab 和https://www.sodocs.net/doc/f99805726.html, 的数据交互和存取是一个非常重要的问题。因为在计算过程中,需要保存大量的数据用于以后的分析使用,如模拟的初始条件、粒子轨道上各点的坐标、速度、磁矩等。

Txt 文本文件和xls 文件是两种常见的文件格式,具有各自的优点。Matlab 和https://www.sodocs.net/doc/f99805726.html, 各自均可以方便的存取这两种格式的文件。虽然在Matlab 中可以通过dlmwrite 和xlswrite 函数把数据写入txt 文本文件和xls 文件,但是我们发现,无论

是将这两条语句写入.m 文件通过https://www.sodocs.net/doc/f99805726.html, 调用,还是在https://www.sodocs.net/doc/f99805726.html, 中直接调用这两个函数都无法实现数据的存储功能,只能通过其它的存储方法[1-2]

。本文将详细阐述该问题及其解

决方法。

1Matlab 和https://www.sodocs.net/doc/f99805726.html, 混合编程中通过Matlab 存储Matlab 计算结果存在的问题

在Matlab 中,函数dlmwrite 和函数xlswrite 可以将其中的矩阵变量写入txt 文本文件和xls 文件。但是,在https://www.sodocs.net/doc/f99805726.html, 和Matlab 的混合编程中,这两条语句却无法实现该存储功能。为了说明这个问题,以dlmwrite 函数建立如下的tempWrite.m 文件:

tempData =random ('Normal',0,10,10,3);;%生成一个随机的10×3矩阵

dlmwrite ('tempTxt.txt',tempData,'delimiter','\t','newline','pc');%将数据写入tempTxt.txt

ReadTempTxtData =dlmread ('tempTxt.txt');%读入temp-Txt.txt 中存储的10×3矩阵

figure;

plot (tempData (:,1));%利用TempData 矩阵的第一列数据作图figure;

收稿日期:2008-04-18;修订日期:2008-06-12。

计算机应用技术

张良,何也熙:Matlab与https://www.sodocs.net/doc/f99805726.html,混合编程中数据存储方式的研究2009,30(8)2009

plot(ReadTempTxtData(:,1));%利用ReadTempTxtData矩阵的第一列数据作图

在Matlab R2007b中,执行tempWrite.m文件,将得到预期的执行结果。每次执行后,将得到新的tempTxt.txt文件,并且文件中存储的数据和画出的图像一致。但是,在Matlab和VB. NET的混合编程中,数据将无法保存在tempTxt.txt文件中。

Matlab和https://www.sodocs.net/doc/f99805726.html,混合编程有两种方法,使用COM组件和使用ActiveX(OLE)自动化服务[3-8]。在我们的程序中,使用ActiveX方法实现https://www.sodocs.net/doc/f99805726.html,对Matlab的调用。所以,此处以Ac-tiveX方法说明这个问题。在https://www.sodocs.net/doc/f99805726.html,的窗口中,为一个按钮的click事件编写下列调用tempWrite.m的代码:

Dim MyMatlab As Object

MyMatlab=CreateObject("matlab.application")'创建Appli-cation对象

MyMatlab.visible=0'不显示Matlab command window窗口MyMatlab.execute("tempWrite")'启动matlab,调用temp-Write.m文件

MyMatlab.quit()

MyMatlab=Nothing:

点击该按钮后发现,Matlab每次执行画出的两幅图像均相同,表明TempData矩阵和ReadTempTxtData矩阵的数据一致;而多次点击画出的图像均不同,表明TempData矩阵和Read-TempTxtData矩阵的确是随机生成的矩阵。但是,tempTxt.txt 文件却从未改变,里面存储的数据仍是上一次单独在Matlab 中执行tempWrite.m文件时存储的数据,该数据与画出的图像也明显不符。这说明,在https://www.sodocs.net/doc/f99805726.html,的调用中,该.m文件确实执行了,只是不知道什么原因,文件并没有更新和保存。

将矩阵变量使用Matlab的xlswrite函数保存为xls文件时也存在这个问题。由于我们的程序需要保存Matlab计算生成的数据,所以必须采取其它的方法来实现该功能。

2通过txt文本文件进行数据存取的方法

txt文本文件是一种常见的文件格式,查看这种格式的文件不需要安装其它程序,用Windows系统自带的记事本即可打开。通过txt文本文件存取数据,具有存取速度快的优点。但是,如前所述,在https://www.sodocs.net/doc/f99805726.html,和Matlab的混合编程中,无法通过调用Matlab 的函数将Matlab的计算结果直接保存到txt文本文件中。

为了解决这个问题,保存Matlab计算得到的模拟结果,在我们的程序中,先通过GetFullMatrix方法将Matlab计算得到的模拟结果通过https://www.sodocs.net/doc/f99805726.html,中的数组保存,然后再将该数组写入txt文本文件中。由于这些数据日后的分析和研究仍主要在Matlab中进行,所以保存的格式应便于Matlab的读取。比如,一个m×n的数组应保存成这样的格式,在txt文本文件中,n个数据一行,共保存m行,一行中的各数据之间以tab键分开。

在https://www.sodocs.net/doc/f99805726.html,中,存取txt文件常用WriteAllText方法,但是,用该方法按照上述格式保存的文件用Matlab却无法读取。在我们的程序中,通过StreamWriter类的write和writeline方法将数据按照上述格式写入txt文本文件。以保存Matlab计算生成的粒子轨迹数据outputOrbit矩阵到orbit.txt中为例,说明具体的存储方法。相关的具体代码如下:

MyMatlab.execute("StandardTokamak")’执行粒子模拟程序

MyMatlab.GetFullMatrix("outputOrbit","base",orbit,tempA)'将结果保存到数组tempA中

'指定要保存的txt文件

Dim TempMyFile As New FileStream("E:\result\orbit.txt",File-Mode.Create,FileAccess.Write)

Dim r As New StreamWriter(TempMyFile)'打开文件

'将数组tempA写入orbit.txt中

For i=0To999

For j=0To2

If j=2Then

r.WriteLine(temp(i,j))'使用WriteLine方法写入数据并换行

Else

r.Write(temp(i,j))

r.Write(Chr(9))'tab键

End If

Next

Next

'参数写入完毕

r.Close()

TempMyFile.Close()'释放相关资源

3通过excel文件进行数据存取的方法

要在https://www.sodocs.net/doc/f99805726.html,中读写Excel文件,需要在项目中添加对“Microsoft Excel12.0Object Library”COM组件的引用。具体方法是点击“项目”菜单的“添加引用”子菜单,在出现的对话框中选择“COM”选项卡,在其中找到“Microsoft Excel12.0Object Library”,选中并点击“确定”按钮。这样,该COM组件就添加到当前项目中了。

要实现对Excel文件的存取,首先需要在代码中创建Acti-veX部件及其对象。然后打开欲写入数据的xls文件和具体的工作表。保存完毕后,保存xls文件并退出excel的自动化服务。仍以保存Matlab计算生成的粒子轨迹数据outputOrbit矩阵到orbit表中为例,说明具体的存储方法。相关的具体代码如下:MyMatlab.execute("StandardTokamak")’执行粒子模拟程序

MyMatlab.GetFullMatrix("outputOrbit","base",orbit,tem-pA)’保存结果到数组中

Dim excelApp As Microsoft.Office.Interop.Excel.Application

Dim excelW orkbook As Microsoft.Office.Interop.Excel.Workbook

Dim excelSheet As Microsoft.Office.Interop.Excel.Worksheet

excelApp=CreateObject("excel.application")'创建Applica-tion对象

excelWorkbook=excelApp.Workbooks.Open(fileName)’打开欲写入数据的xls文件

excelSheet=excelWorkbook.Worksheets("orbit")’指定欲写入数据的orbit表

For i=0To999

For j=0To2

excelSheet.Cells(i+1,j+1).value=tempA(i,j)

20102009,30(8)计算机工程与设计Computer Engineering and Design

Next

Next

excelWorkbook.Save()'保存xls文件

excelWorkbook.Close()'关闭工作表

excelApp.Quit()'退出excel服务

4两种存取方式的比较

通过txt文本文件方式存取数据速度比较快,但是为了方便Matlab的读取,存储数据时需要设计恰当的存储格式。并且在https://www.sodocs.net/doc/f99805726.html,中,存取文本文件的方法很多,而有些方法保存的文本文件并不能被Matlab识别,比如本文中提到的WriteAll-Text方法。在我们的模拟程序中,需要保存的数据比较多,比如粒子轨道的坐标、粒子的速度、磁矩等,这些需要建立不同的文本文件,给日后的读取和分析带来了不便。

通过Excel将数据存储为xls文件,不用考虑数据保存的格式问题,方便通过Matlab读取。并且一次模拟中得到的需要保存的众多结果,比如粒子轨道的坐标、粒子的速度、磁矩等,可以存储在一个xls文件中不同的表中,便于日后的读取和分析。但是,数据量较大时,存储为xls文件需要花费更多的时间,而且xls文件中的一个表最多只能保存65536行、256列的数据,需要保存更多的数据时需要存储在其它的表或xls文件中。

通过以上比较可以看出,这两种存取方式具有各自的优点和不足。在程序开发的过程中应根据各种应用的实际需要进行恰当选择。

5结束语

在Matlab和https://www.sodocs.net/doc/f99805726.html,的混合编程中,通过https://www.sodocs.net/doc/f99805726.html,调用Matlab的相关函数无法直接将计算结果保存到txt或xls文件中,保存计算结果需要采取其它方法。本文通过Matlab和VB. NET混合编程中的具体实例,说明了这一现象,并给出了在Matlab和https://www.sodocs.net/doc/f99805726.html,混合编程中将Matlab计算结果保存为txt和xls文件的具体方法,指出了程序开发过程中应该注意的问题。Txt和xls两种文件格式具有各自的优点和不足,本文比较了这两种格式各自的特点。

根据本文介绍的内容,结合所开发程序的特点,可以在这两种存储方法中做出恰当的选择。

参考文献:

[1]简清华,钟化兰.Matlab的数据文件I/O的实现方法[J].计算机

与现代化,2003(5):75-77.

[2]张宏立,陈华,李喆.实现VB与MATLAB数据交换的新方法

[J].计算机应用与软件,2004,21(12):51-52.

[3]李俐玲.VB与Matlab相结合混合编程方法的研究[J].绵阳师

范学院学报,2004,23(5):26-27.

[4]岳玉芳,尤忠生,张玉双.基于COM的VB与Matlab混合编程

[J].计算机工程与设计,2005,26(1):61-62.

[5]欧金成,林德杰,彭备战.通过VB调用MA TLAB实现图形和

界面的结合[J].计算机工程与设计,2002,23(12):64-66.

[6]李永曦,陶伟莲,关立行.在VB6.0中调用Matlab程序[J].微机

发展,2004,14(1):88-89.

[7]赵耀,吕运鹏.基于COM接口的VC++与Matlab混合编程[J].

计算机与信息技术,2007(5):57-59.

[8]文小琴,赵志诚,孙志毅.VB与Matlab的动态数据交换及其应

用[J].控制工程,2002,9(5):88-91.

(上接第1976页)

4结束语

本文在对当前计算机自动组卷研究现状进行分析的基础上,给出了一种改进的计算机自动组卷问题模型,该模型能更好地满足了实际组卷需求。基于新出现的差分进化算法,研究并提出了一种新型的智能组卷算法,且算法具有原理简单、易于实现、控制参数少、鲁棒性好等优点。实验表明,与简单遗传算法相比,该算法能更好地解决计算机自动组卷问题。下一步将对算法的收敛速度进行改进,并将其应用于在线组卷。

参考文献:

[1]王萌,金汉均,王晓荣.集合随机抽选法在智能组卷中的研究[J].

计算机工程与设计,2006,27(19):3583-3585.

[2]曾一,冉忠,郭永林.试题库中自动组卷的算法及试卷测评策略

[J].计算机工程与设计,2006,27(16):3024-3027.

[3]金汉均,郑世珏,吴明武.分段随机抽选法在智能组卷中的研究

与应用[J].计算机应用研究,2003,20(9):102-104.

[4]闵应洲,苏德,陈宁江.基于矩阵编码的遗传算法及其在自动组

卷中的应用[J].计算机工程,2003,29(6):73-76.

[5]王萌,唐培和,李春贵.基于改进遗传算法的智能组卷研究[J].计

算机应用与软件,2008,25(2):49-51.

[6]陆亿红,柳红.基于整数编码和自适应遗传算法的自动组卷[J].

计算机工程,2005,31(23):232-233.

[7]董敏,霍剑青,王晓蒲.基于自适应遗传算法的智能组卷研究[J].

小型微型计算机系统,2004,25(1):82-85.

[8]Kenneth V Prince,Rainer M Storn,Jouni A Lampinen.Differen-

tial evolution:A practical approach to global optimization[M].

Berlin:Springer,2005:30-34.

[9]Nurhan,Karaboga.Digital IIR filter design using differential

evolution algorithm[J].EURASIP Journal on Applied Signal Processing,2005(1):1269-1276.

[10]王文宏,王凤蕊,潘全科.解决移动计算位置管理问题的差分进

化算法[J].计算机工程与设计,2008,29(11):2875-2878. [11]潘全科,王文宏,朱剑英.用差异进化和变邻域搜索解决无等待

流水线调度问题[J].中国机械工程,2006,17(S2):157-160. [12]France Cheong,Richard Lai.Designing a hierarchical fuzzy logic

controller using the differential evolution approach[J].Applied Soft Computing,2007,7(2):481-491.

[13]郭振宇,安强,程博.差异演化算法在热连轧工作辊温度仿真中

的应用[J].系统仿真学报,2007,19(21):4877-4880.

相关主题