Matlab和Excel混合编程.pdf
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)在打开的“加载宏”对话框中单击“浏览”按钮,选择用户自己的matlabtoolboxexlink 路径下的 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