Matlab和Excel混合编程
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Matlab和Excel混合编程
2011-07-18 21:26:17| 分类:Excel VBA | 标签:|举报|字号大中小订阅
MATLAB与Excel的混合编程有两种方式:(1)利用MATLAB提供的Excel Link插件,实现Excel与MATLAB
的数据共享;(2)利用MATLAB提供的Excel生成器,生成dll组件和VBA代码,dll组件可以进行COM生成器
组件相似的操作,VBA代码则可以在Excel的Visual Basic编译器中直接使用,可以保存为插件.
第一种方法:通过Excel Link实现Excel和MATLAB的数据共享
1.Excel Link是一个软件插件,它可将Excel与MATLAB进行集成,通过MATLAB与Excel的链接,用户可
以在Excel的工作空间中,利用Excel的宏编程功能,使用MATLAB 的数据处理和图形处理功能进行相关操
作,同时Excel保证MATLAB和Excel工作空间数据的交换和同步更新。
使用Excel Link时,不必脱离Excel
环境,而直接在Excel的工作区或者宏操作中调用MATLAB函数,Excel提供了11个函数来实现链接和数据
操作。
2.Excel Link的安装
Excel Link对运行环境没有要求,只要能够同时运行MATLAB和Excel即可,大概要200KB的空间,在
Windows平台下要求先安装Excel,再安装MATLAB。
Excel Link 的安装步骤如下:(1)启动Excel,选择菜单
栏中的“工具(Tools)”,执行“加载宏”命令;(2)在打开的“加载宏”对话框中单击“浏览”按钮,
选择用户自己的\matlab\toolbox\exlink路径下的excellink.xla文件(可能是隐藏文件),然后单击“确
定”按钮。
(3)返回“加载宏”窗口,此时已经选中了“Excel link”选项,单击“确定”按钮;(4)重
新启动Excel就可以看到多一行“Spreadsheet link EX”工具栏。
3.设置Excle link的启动方式
在启动Excle时,如果不希望同时启动Excel link和Matlab,在Excel 数据表单元中输入
“=MLAutoStart("no")”。
手动启动Excel link和Matlab,在菜单中选择“宏”,在打开的“宏”对话框中输入“MATLABinit
”,单击“执行”按钮。
在Excel环境中启动或终止Excel link和Matlab,在单元格中输入“=MLOpen()”或“=MLClose()”。
4.Excel Link的数据管理函数
Excel提供了9个数据管理函数,实现MATLAB与Excel之间的数据复制,并可在Excel中执行MATLAB命
令。
MATLABfcn() 对于给定的Excel数据,运行MATLAB命令MATLABsub() 对于给定的Excel数据,运行MATLAB命令并指定输出位置
MLDeleteMatrix() 删除MATLAB矩阵
MLEvalString() 执行MATLAB命令
MLGetMatrix() 向Excel数据表中写入MATLAB矩阵的数据内容MLGetVar() 向Excel数据表VBA写入MATLAB矩阵的数据内容MLAppendMatrix() 向MATLAB空间添加Excel数据表的数据MLPutMatrix() 向Excel数据表创建或覆盖MATLAB矩阵MLPutVar() 向Excel数据表VBA创建或覆盖MATLAB矩阵
下面详细介绍一下它的用法:
(1) Matlabfcn
根据给定的Excel数据执行Matlab命令。
在工作表中使用时的语法:matlabfcn(command,inputs)
参数command,Matlab将执行的命令,命令需要写成“command”(使用双引号引起来)的形式。
参
数inputs 传给Matlab命令的变长输入参数列表。
列表是包含数据的工作表单元格范围。
函数返回单一
数值或者是字符串,结果返回到调用函数的单元格中。
例如matlabfcn(”sum”,B1:B10);把从B1到B10的单元格中数据相加。
(2) Matlabsub
根据给定的Excel数据执行Matlab命令,并将结果返回到指定的单元格中。
在工作表中的使用语法:matlabsub(command,edat,inputs)command和inputs参数的与matlabfcn相同。
参数edat,指定返回值写入在工作表中的位置。
如果
edat用双引号引起来,则edat必须是单元格地址或范围的名字。
如果参数不用引号引起edat的形式,则
通过计算获得矩阵名。
例如:matlabsub(”sum”,”A1”,B1:B10);把工作表中从单元格B1到B10的数据相加,并将结果返
回到单元格A1中。
注意:edat指定的位置不能包含matlabsub所在的位置。
(3) MLAppendMatrix
将Excel工作表中的数据追加到Matlab中指定的矩阵中如果该矩阵
不存在,则创建矩阵。
在工作表中使用的语法:MLAppendMatrix(var_name,mdat)
在宏中使用的语法:MLAppendMatrix var_name,mdat
注意要追加的数据维数要和原矩阵中的维数相匹配,否则出错。
例如:MLAppendMatrix(”a”,A1:A2);假设矩阵a是个2行3列的矩阵,如下图:将A1:A2中的数
据追加到矩阵后,如下图示成为矩阵的第四列,如下图示。
单元格B1中是字符a,函数MLAppendMatrix(B1,A1:A2)的作用于MLAppendMatrix(”a”,A1:A2)相
同。
(4) MLDeleteMatrix
删除Matlab空间中指定的矩阵
在工作表中使用的语法:MLDeleteMatrix(var_name);
在宏中使用的语法:MLDeleteMatrix var_name
Var_name,是要删除的矩阵名,如果矩阵名在引号内“var_name”的形式,则直接指定变量名,如
果var_name不用引号引起来,则通过计算获得实际矩阵的名字。
例如,单元格B1中的内容为a,MLDeleteMatrix(B1),则表示删除Matlab工作空间的矩阵a,它等价
于MLDeleteMatrix("a")
(5) MLEvalString
将命令(写成字符串的形式)传到Matlab中执行。
在工作表中使用的语法:MLEvalString(command);
在宏中使用的语法:MLEvalString command
参数command如果是用引号引起来”command”的形式,则是直接指定命令;如果不用引号引起来
command的形式,则command必须是包含了命令字符串的工作表的单元格地址或者是范围。
例如:MLEvalString(”b=magic(4)”);表示在Matlab中执行命令b=magic(4);
(6) MLGetMatrix
将指定的Matlab矩阵写入到Excel工作表中的指定位置。
在工作表中使用的语法:MLGetMatrix(var_name,edat)
在宏中使用的语法:MLGetMatrix var_name,edat
参数Var_name,是要写入工作表的矩阵名,如果矩阵名在引号内“var_name”的形式,则直接指定
变量名,如果var_name不用引号引起来,则通过计算获得实际矩阵的名字。
参数edat指定了矩阵写入工组表的位置。
如果参数是用引号引
起”edat”的形式,则是直接指定矩
阵名,如果参数不用引号引起edat的形式,则通过计算获得矩阵名。
例如:MLGetMatrix(”a”,”sheet1!B1”);将矩阵a写入工作表sheet1以单元格B1起始的位置
,如果a是一个2行3列的矩阵,则矩阵占据sheet1的B1到D2的空间。
如果在A1中有字符串a,则
MLGetMatrix(A1,” sheet1!C1”)的作用与MLGetMatrix
(”a”,”sheet1!C1”)相同。
(7) MLGetVar
将MatLab矩阵传送给Excel VBA变量,只能在宏子例程中使用。
使用语法:MLGetVar ML_var_name,VBA_var_name
参数ML_var_name是将获取的矩阵名。
如果矩阵名在引号内“ML_var_name”的形式,则直接指定变
量名,如果ML_var_name不用引号引起来,则通过计算获得实际矩阵的名字。
参数VBA_var_name,将其Matlab矩阵数据传给的VBA变量名,不用引号将其引起来。
例如:Sub Fetch()
MLGetVar J,DataJ
End Sub
表示将Matlab矩阵J的数据写入到VBA变量DataJ中。
(8) MLPutMatrix
用指定位置的Excel工作表中的数据,创建或者覆盖Matlab矩阵。
在工作表中使用的语法:MLPutMatrix(var_name,mdat)
在宏中使用的语法:MLPutString var_name,mdat
参数var_name是将有被创建或者被覆盖的矩阵名。
如果指定的矩阵不存在,则创建该矩阵,如果矩
阵已经存在,则覆盖该矩阵。
参数mdat,指定工作表中的位置。
例如:工作表中有A1到C2的数据,使用函数MLPutMatrix(”c”,A1:C2),则可以将这些数据写到
Matlab矩阵c中。
注意:如果修改工作表中的数据,则Matlab中的矩阵相应发生变化。
如果把数据剪切到
别的地方,如D1到F2,则函数MLPutMatrix(”c”,A1:C2)会自动更改为MLPutMatrix(”c”,D1:F2
)
(9) MLPutVar
使用VBA变量的数据创建或者覆盖Matlab 矩阵。
只能在宏子例程中使用。
使用语法:MLPutVar ML_var_name,VBA_var_name
参数ML_var_name是将被创建或覆盖的矩阵名。
如果矩阵名在引号内“ML_var_name”的形式,则直
接指定变量名,如果ML_var_name不用引号引起来,则通过计算获得实际矩阵的名字。
参数VBA_var_name,将其数据传给Matlab矩阵的VBA变量名,不用引号将其引起来。
如果VBA_var_name变量包含字符串的数据,则输出到Matlab为元胞数组格式。
例如:Sub Put()
MLPutVar K,DataK
End Sub
用VBA变量DataK中的数据创建或着覆盖Matlab矩阵K。
5. 补充使用Excel Link的注意事项
(1)Excel工作表通常以“=”作为起始标记,例如=matlabfcn ("sum",B1:B10);
(2)大多数的Excel Link函数中有两种定义变量的方式:直接定义,即将变量用双引号标记则是直接
定义变量,例如MLGetMatrix(”bonds”,”sheet1!C1”),其中bonds 是直接定义的变量;间接定义
,函数中的不用双引号的工作表单元地址或行列名称被看作是间接变量,函数对其指引的内容进行操作。
工作表单元地址可以包含页表序号,例如MLDeleteMatrix(B1);单元格B1中的内容为a,则相当于执
行MLDeleteMatrix(”a”);
(3)建议使用Excel Link的自动计算模式。
如果在手动计算模式下使用MLGetMatrix函数,当在单元
格中输入完函数等式时,需要按F9键执行,而按下F9键将有可能引起其他工作表函数的重复执行,产生
不可预料的后果。
设置Excel Link自动计算模式方法如下:在
Excel“工具”菜单的“选项”,选择重新
计算标签。
(4)如果需要在工作表中重新计算Excel Link函数,最好按F2键和回车键单步执行每个函数。
(5)如果在MLGetMatrix函数中使用了单元的直接地址,那么当删除了行或列或者将函数从其他单元
复制到新的单元后,一定要重新修改地址。
Excel Link不能自动改变MLGetMatrix中的地址。
(6)在打开一个包含ExcelLink函数的Excel数据表的时候,Excel会自动从上到下,从左到右地执行
这些函数,所有有可能出现如“#COMMAND!”或“#NONEXIST”等Excel错误提示,只需关闭所有Matlab图
形窗口,然后按F2键并回车重新单步执行单元格里地函数就可以了。
6. 在工作表和在宏中使用ExcelLink的例子
例1 :(在工作表中使用ExcelLink)如下图所示:使用mlopen()函数启动Matlab,
使用mlevalstring("load census")载入matlab自带的数据文件census,其中包含矩阵cdate和pop。
使用mlgetmatrix("cdate","E1"),将Matlab空间的矩阵cdata写入到工作表中以E1开始的位置;
mlgetmatrix("pop","F1");将Matlab空间的矩阵pop写入到工作表中以F1开始的位置;
mlputmatrix(x,E1:E21)
mlputmatrix(y,F1:F21);将E1到E21中的数据以及F1到F21中的数据分别写入到Matlab空间的
矩阵变量x和y中。
mlevalstring(z=x-mean(x)./std(x))
mlevalstring([p2,s2]=polyfit(z,y,2))
mlevalstring([pop2,de12]=polyval(p2,z,s2)) 根据所给的数据拟合多项式并进行偏差计
算。
mlevalstring(plot(x,y,'+',x,pop2,'g-',…x,pop2+2*del2,'r:',x,pop2-2*del2,'r:')) 绘出离散点、拟合曲线图及偏差曲线图,结果如下图示:
mlclose();关闭Matlab。
例2:在宏中使用Excel Link
新建一个Excel工作表,打开Visual Basic编辑器,操作如下图示:然后在工程管理器中插入模块
,在模块代码区域写下如下代码:
Function excellinktest()
MLOpen
mlevalstring load census
mlgetmatrix cdate,E1
mlgetmatrix pop,F1
mlputmatrix x,Range(E1:E21)
mlputmatrix y,Range(F1:F21)
Matlabrequest
mlevalstring z=(x-mean(x))./std(x)
mlevalstring [p2,s2]=polyfit(z,y,2)
mlevalstring [pop2,del2]=polyval(p2,z,s2)
mlevalstring plot(x,y,'+',x,pop2,'g-',x,pop2+2*del2,
'r:',x,pop2-2*del2,'r:')
End Function
选中模块1,在“工具”菜单,“引用”选项。
弹出引用对话框,选择Excel Link,确定后,即可运
行该程序,结果与例1相同。
1、MATLAB的数据导出问题:
如果计算结果被保存为B矩阵:
第一步在指令栏输入:》save 'b.txt' B -ascii %(把矩阵B 的数据,导出到了TXT文件中,
名字为b.txt)% 回车
结果b.txt文件就会被保存到work文件夹下
打开b.txt,你会发现,如果数据很多,排列可能没有想象的整齐,而且是二进制显示的,你会怀疑出
问题了,别担心,没问题。
6.补充2个设置函数
MLStartDir Specify MATLAB current working folder after startup MLShowMatlabErrors Return standard Spreadsheet Link EX errors or full MATLAB errors using MLEvalString。