罗兰在MATLAB的艺术

把想法变成MATLAB

请注意

罗兰在MATLAB的艺术已经存档,不会被更新。

使用Microsoft . net扩大MATLAB功能

艾特威尔肯MATLAB产品管理组客人本周博客是关于他最近的经历使用Microsoft . net®以及如何使用MATLAB扩展能力的广度,特别是在情况下你需要一个工具,MATLAB并不直接供应。

内容

Microsoft . net开发应用程序是一个软件框架在Microsoft Windows。值得注意的是,它包括一个全面的图书馆各类通用的编程任务,从网络和安全文件解析。R2009a以来,MATLAB调用net库,但作为一个新手个人。net,直到最近,我有足够的动力去投资它学习它。这是一个非常积极的经验,所以我想我应该分享我的故事在这个博客。

引进来解决的问题

有一天,我在实验MATLAB函数REGMATLABSERVER。寄存器MATLAB作为自动化服务器,以便它可以由其他应用程序控制。例如,这是使用电子表格链接前让生活从Microsoft Excel数据传输到MATLAB(即使你不知道也不关心这些东西是什么,容忍我,我们讨论的是一般的适用)。在Windows 7或Windows Vista,注册是一个管理员级别的操作,将导致用户帐户控制(UAC)弹出一个对话框提示用户确认操作。事实证明,REGMATLABSERVER以目前的形式不调用UAC和MATLAB会注册失败。解决方法很简单——MATLAB作为管理员运行(右键单击MATLAB开始菜单图标),从内部寄存器特权MATLAB。但是,这让我想知道,是否有办法从内部调用UAC MATLAB,避免需要运行MATLAB作为一个整体作为管理员吗?

检查的实施REGMATLABSERVER表明,它通过简单地调用MATLAB的第二个实例与一个特殊的命令行开关。这些是相关的命令REGMATLABSERVER:

命令= sprintf (“% s”/等待/ regserver / r辞职的,…fullfile (matlabroot‘本’,matlab));(年代,味精)=系统(命令);

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

所以,我真的需要找出如何调用一个过程作为一名管理员。我知道没有办法在MATLAB中,就像任何人,我用谷歌找到编程的方法来启动流程作为管理员。我很快了解到,. net提供了设施要做到这一点,并发现源代码在c# /。净(英文维基百科页面UAC的地方),演示了如何去做。起初,这给了我一些停顿,因为我从来没有使用c#或. net在任何有意义的方式。但是,代码的可读性很好,所以我决定将代码放入MATLAB,看看我可以使它工作。维基百科的c#代码是:

System.Diagnostics.Processproc = new System.Diagnostics.Process(); proc.StartInfo.FileName = "C:\\Windows\\system32\\notepad.exe"; proc.StartInfo.Verb = "runas"; // Elevate the application proc.Start();

将代码移植到MATLAB

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

  • 第一行创建了一个变量的类型System.Diagnostics.Process。我不确定这意味着什么,但我真的不需要知道。MATLAB是隐式类型,类型名称不需要在变量声明(即的左侧=)。此外,c#关键字不需要。
  • 第二和第三行需要他们的字符串单引号代替双引号包围。
  • 第三行上的评论需要之前%而不是/ /
  • 这导致了下面的MATLAB代码:

    proc = System.Diagnostics.Process ();proc.StartInfo。文件名= ' C: \ \ Windows \ \ system32系统\ \ notepad.exe”;proc.StartInfo。动词=“runas”;%提高应用proc.Start ();

    整洁!用很少的努力,我有一个脚本,启动记事本应用程序作为管理员,根据需要触发UAC提示。我的下一个步骤就是使用这个作为起点其实我想做的事情,即开始MATLAB作为管理员与额外的命令行参数(我们看到实现的REGMATLABSERVER如上图所示)。因为我现在知道我需要。net类的名称(System.Diagnostics.Process),我能够到达MSDN参考页面(同样,Google是你的朋友)。这个参考页面和标签之间完成在MATLAB(类型proc。,然后按下Tab键),我可以闲逛,并指定我需要的部分:

    proc = System.Diagnostics.Process;% EXE proc.StartInfo运行。文件名= fullfile (matlabroot,“本”、“matlab”);EXE proc.StartInfo %的论点。参数= ' /等待/ regserver / r辞职的;%管理proc.StartInfo run - as。动词=“runas”;proc.Start ();%开始

    完善的解决方案

    现在是工作,但有两个我不喜欢的东西:

  • 产卵过程后,立即返回MATLAB控制,但我希望MATLAB阻塞,直到产生过程完成,这样我就可以检查退出代码。
  • 有一个空的命令提示符窗口在屏幕上可见的几秒钟。化妆品,可以肯定的是,但丑陋。
  • 另一个几分钟的实验和迭代,我要一个更令人满意的实现:

    proc = System.Diagnostics.Process;% EXE proc.StartInfo运行。文件名= fullfile (matlabroot,“本”、“matlab”);EXE proc.StartInfo %的论点。参数= ' /等待/ regserver / r辞职的;%管理proc.StartInfo run - as。动词=“runas”;proc.StartInfo。WindowStyle =…System.Diagnostics.ProcessWindowStyle.Hidden;proc.Start (); % Start proc.WaitForExit(); % Wait for the process to end proc.ExitCode %Display exit code

    不坏!还了解。net,我花了大约半小时来创建我的第一MATLAB脚本利用。net。当然,这是一个简单的程序,但它是新的和有用的。我知道这听起来毫无新意,但这对我来说是一种启发性的时刻我不会犹豫地利用。net的情况下出现。

    第二个实验

    第二个实验,我回忆听到某处。net包括语音合成器。我认为这可能是一个“有趣”的例子,所以我谷歌搜索”。网络语音合成”,发现一个不错的文章代码c++, c#和VB。阅读短文,说一些关于需要“引用System.Speech大会”。我不知道那是什么意思,所以我继续前行。最近的c#代码看起来MATLAB代码,所以我从这个问题开始:

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

    和之前一样,我调整的东西一点点语法同意MATLAB:

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

    在这里,MATLAB(也许不足为奇)生成一个错误使用关键字。作为一个过去的c++程序员,我认出了使用声明的方式将一个名称空间范围;表示更务实,这是一个机制来保存按键后在您的代码中。我可以避免的需要使用声明,只要指定完整的“路径”SpeechSynthesizer而不是:

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

    但是,仍然不工作,当我对一个未定义的变量或类引发一个错误。嗯…想我早些时候需要注意当这篇文章建议我添加一个引用System.Speech组装。我不知道如何做到这一点在MATLAB中,所以我谷歌搜索“MATLAB引用添加到. net汇编”。对我来说,第一夫妇的结果来自mathworks.com。第一个结果是一个指数函数;第二个主题开始使用。net。阅读前几段的介绍,我了解到在我需要使用MATLABNET.addAssembly加载一个装配。它类似于使用JAVAADDPATH对MATLAB Java类可见。事实证明,一些特别有用的程序集加载默认情况下,这也解释了为什么我不需要麻烦的第一个例子(基本上,我很幸运!)。

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

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

    !我的电脑现在对我说“Hello world”。因为我开心的时候,我改变了消息告诉我一周的一天:

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

    我现在有我的第二个MATLAB程序使用。net。这一个是接触更复杂,我需要了解NET.addAssembly,但这是一个障碍的我能够克服。

    结论

    底线是:当你想解决的问题是在MATLAB的正常范围之外,不要低估。net框架的力量在你的指尖(或者,只是碰碰运气。net尚未安装,它是来自微软的免费下载)。此外,不要吓到。net如果您以前从未使用过它,作为起点(代码片段)很容易得到和c#和其他语言常常可以很容易地移植到MATLAB。

    我很好奇听如果任何读者在MATLAB与。net的经历。你解决什么样的问题?插话下面!




    使用MATLAB®7.11发表


    コメント

    コメントを残すには,ここをクリックしてMathWorksアカウントにサインインするか新しいMathWorksアカウントを作成します。