罗兰谈MATLAB的艺术

将想法转化为MATLAB

使用Microsoft .NET扩展MATLAB功能

MATLAB产品管理组的Ken Atwell本周将发表客座博客,介绍他最近使用Microsoft . net®的经验,以及如何使用它来扩展MATLAB的功能广度,特别是在需要MATLAB无法直接提供的工具的情况下。

内容

. net是用于在Microsoft Windows上开发应用程序的软件框架。值得注意的是,它包括一个全面的库,用于各种通用编程任务,从网络和安全到文件解析。从R2009a开始,MATLAB已经能够调用成net库但是就我个人而言,作为。net的新手,直到最近我才有足够的动力去投资学习它。这是一次非常积极的经历,所以我想在这篇博客中分享我的故事。

介绍要解决的问题

有一天,我在用MATLAB函数做实验REGMATLABSERVER.它将MATLAB注册为自动化服务器,以便其他应用程序可以控制它。例如,这是由电子表格Link EX实现从Microsoft Excel到MATLAB的实时数据传输(即使你不知道或不关心这些东西是什么,请原谅我,因为我们正在讨论的大部分内容都是普遍适用的)。在Windows 7或Windows Vista下,注册是管理员级别的操作,该操作将导致用户帐户控制(UAC)弹出一个对话框,提示用户确认该操作。事实证明,REGMATLABSERVER它的当前形式不会调用UAC,并且会简单地无法注册MATLAB。解决方法非常简单——以管理员身份运行MATLAB(右键单击MATLAB开始菜单图标),然后从特权MATLAB中注册。但是,这让我想知道,有没有一种方法可以从MATLAB内部调用UAC,从而避免作为一个管理员运行整个MATLAB ?

检查执行REGMATLABSERVER展示了它通过简单地调用MATLAB的第二个实例和一个特殊的命令行开关来工作。的相关命令REGMATLABSERVER

Command = sprintf(' ' %s" /wait /regserver /r quit',…fullfile (matlabroot‘本’,matlab));[s,msg] = system(command);

找到一个c# /。网络解决方案

因此,我真正需要弄清楚的是如何调用流程作为管理员.我知道在MATLAB中没有办法做到这一点,所以像任何人一样,我使用谷歌找到编程方法来作为管理员启动进程。我很快了解到。net提供了这样做的工具,并在c# /中找到了源代码。NET(关于UAC的英文维基百科页面(在所有地方),说明如何做到这一点。起初,这让我有些犹豫,因为我从未以任何有意义的方式使用过c#或。net。但是,代码非常易读,所以我决定把代码放到MATLAB中,看看我是否能让它工作。来自维基百科的c#代码是:

System.Diagnostics.Process proc = new System.Diagnostics.Process();proc.StartInfo.FileName = "C:\\Windows\\system32\\notepad.exe";proc.StartInfo.Verb = "runas";//提升应用程序proc.Start();

将代码移植到MATLAB

我需要做的第一件事是做一些小的语法改变,把这个c#程序变成MATLAB程序。的帮助下MATLAB代码分析器(编辑器中那些红色和橙色波浪线),我可以在一分钟内获得有效的MATLAB代码。我需要做三件事:

  • 第一行创建了一个类型变量System.Diagnostics.Process.我不确定这到底是什么意思,但我真的不需要知道。MATLAB是隐式类型化的,因此在变量声明中不需要类型名(即).此外,c#关键字不需要。
  • 第二行和第三行字符串需要用单引号括起来,而不是双引号。
  • 第三行注释的前面需要加上而不是//
  • 这导致以下MATLAB代码:

    proc = System.Diagnostics.Process();proc.StartInfo.FileName = 'C:\\Windows\\system32\\notepad.exe';proc.StartInfo.Verb = 'runas';提升应用程序proc.Start();

    整洁!我很轻松地编写了一个脚本,以管理员身份启动记事本应用程序,并在必要时触发UAC提示。我的下一步是将此作为我实际想做的事情的起点,即以管理员身份使用额外的命令行参数启动MATLAB(正如我们在的实现中看到的那样REGMATLABSERVER如上图所示)。既然我现在知道了我需要的.NET类的名称(System.Diagnostics.Process),我才得以到达MSDN参考页(再说一次,谷歌是你的朋友)。在此参考页面和tab补全在MATLAB(类型proc。,然后按下Tab键),我就可以到处戳,并指定我需要的位:

    proc = System.Diagnostics.Process;% EXE运行proc.StartInfo.FileName = fullfile(matlabroot,'bin','matlab');% EXE proc.StartInfo.Arguments = '/wait /regserver /r quit';% Run-as admin proc.StartInfo.Verb = 'runas';proc.Start ();%开始

    细化解决方案

    现在它开始工作了,但有两件事我不喜欢:

  • 生成进程后,控制权立即返回给MATLAB,但我希望MATLAB阻塞直到生成进程完成,以便我可以检查退出代码。
  • 屏幕上有一个空的命令提示符窗口,持续了几秒钟。当然是化妆品,但很丑。
  • 又进行了几分钟的实验和迭代,我得到了一个更令人满意的实现:

    proc = System.Diagnostics.Process;% EXE运行proc.StartInfo.FileName = fullfile(matlabroot,'bin','matlab');% EXE proc.StartInfo.Arguments = '/wait /regserver /r quit';% Run-as admin proc.StartInfo.Verb = 'runas';proc.StartInfo.WindowStyle =…System.Diagnostics.ProcessWindowStyle.Hidden;proc.Start ();%启动proc.WaitForExit();等待进程结束proc.ExitCode %显示退出码

    不坏!由于对. net几乎一无所知,我花了大约半小时的时间创建了我的第一个利用。net的MATLAB脚本。当然,这是一个简单的程序,但它做了一些新的有用的事情。我知道这听起来很老套,但这对我来说是一个启示时刻,当下一次出现这种情况时,我会毫不犹豫地利用。net。

    第二个实验

    对于第二个实验,我记得在什么地方听说过。net包含一个语音合成器。我认为这可能是一个“有趣”的例子,所以我谷歌搜索”。NET语音合成”,找到了一个这篇文章写得不错,可使用c++、c#和VB编写代码。通读这篇短文,它说需要“参考系统。演讲大会”。我不太清楚这意味着什么,所以我继续前进。c#代码看起来最接近MATLAB代码,所以我从它开始:

    使用System.Speech.Synthesis;音箱= new SpeechSynthesizer();演讲者。Rate = 1;演讲者。体积= 100;演讲者。说话(“Hello world”。);

    像以前一样,我稍微调整了一下,使语法符合MATLAB:

    使用System.Speech.Synthesis;speaker = SpeechSynthesizer();演讲者。Rate = 1;演讲者。体积= 100;演讲者。说话(“Hello world”。);

    在这里,MATLAB(也许并不奇怪)生成了一个错误使用关键字。作为一个过去的c++程序员,我认识到使用语句作为将名称空间引入作用域的一种方式;从更实际的角度来说,它是一种在代码后面保存击键的机制。我就不需要使用语句,只需指定到的完整“路径”SpeechSynthesizer而不是:

    speaker = System.Speech.Synthesis.SpeechSynthesizer();演讲者。Rate = 1;演讲者。体积= 100;演讲者。说话(“Hello world”。);

    但是,这仍然不起作用,因为我触发了一个关于未定义的变量或类的错误。嗯,我想我需要注意之前的文章建议我添加一个引用系统。演讲组装。我不知道如何在MATLAB中做到这一点,所以我谷歌搜索“MATLAB添加引用到. net程序集”。对我来说,前两个结果来自mathworks.com。第一个结果是函数的索引;第二是话题.NET入门.通过阅读前几段的介绍,我了解到在MATLAB中我需要使用NET.addAssembly加载程序集。它类似于使用JAVAADDPATH使Java类对MATLAB可见。事实证明,默认情况下加载了一些特别有用的程序集,这解释了为什么在第一个示例中我不需要为此费心(基本上,我很幸运!)

    有了这些信息,我插入了一行代码,在使用程序集的类之前添加它:

    NET.addAssembly(“System.Speech”);speaker = System.Speech.Synthesis.SpeechSynthesizer();演讲者。Rate = 1;演讲者。体积= 100;演讲者。说话(“Hello world”。);

    !我的电脑现在对我说“你好,世界”。因为我玩得很开心,所以我把消息改成告诉我星期几:

    NET.addAssembly(“System.Speech”);speaker = System.Speech.Synthesis.SpeechSynthesizer();演讲者。Rate = 1;演讲者。体积= 100;[~ S] =工作日(日期、多头);演讲者。说话(['Today is ' S]);

    现在我有了第二个使用。net的MATLAB程序。这个问题有点复杂,因为我需要理解NET.addAssembly,但这是一个我能够轻而易举地克服的障碍。

    结论

    底线:当你想要解决一个超出MATLAB正常范围的问题时,不要低估。net Framework的强大功能(或者,如果。net还没有安装的话,它可以从微软免费下载)。此外,如果你从未使用过。net,也不要被它吓倒,因为起点(代码片段)很容易得到,c#和其他语言通常可以很容易地移植到MATLAB中。

    我很好奇是否有读者在MATLAB中使用过。net。你解决什么样的问题?插话下面




    使用MATLAB®7.11发布

    |

    评论

    如欲留言,请点击在这里登录您的MathWorks帐户或创建一个新帐户。