罗兰谈MATLAB的艺术

将想法转化为MATLAB

请注意

罗兰谈MATLAB的艺术已存档,不会更新。

MATLAB数据类型作为独立应用程序的参数

客人的博客彼得•韦伯返回另一个偶尔系列关于应用程序部署的帖子。

内容

当你创建独立的可执行文件从MATLAB函数与MATLAB编译器,生成的主程序将命令行参数作为字符串处理的能力有限。在前一篇文章中,我介绍了处理字符串参数并将它们转换为数字标量的技术。本周,我将向您展示如何在独立可执行文件中处理更复杂的参数。

MATLAB-Type参数

MATLAB的数据类型包含的远不止字符串和标量。此示例演示如何将单元格数组和函数句柄传递给一个独立的可执行文件。

这个函数cellops接受两个输入:数据单元格数组和应用于单元格数组中每个单元格的函数。cellops调用cellfun两次:一次将函数应用到单元格数组,第二次显示结果。

这个函数作为一个独立的可执行文件工作,因为它调用eval如果输入是字符串。因此,命令行上的字符串必须是有效的MATLAB表达式。

如果输入是一个字符串,假设它是一个MATLAB表达式,并对它调用EVAL。If ischar(celldata) celldata = eval(celldata);结束
ischar(fcn) fcn = eval(fcn);结束
将函数应用到单元格数组。output = cellfun(fcn, celldata, 'UniformOutput', false);
显示所有结果。cellfun (@disp、输出);

编译MATLAB函数:

MCC -mv cellops

然后,通过cellops单元格数组和函数句柄,如下面的两个示例所示。

示例1

使用cellops计算两个随机数据集的平均值。第一个参数是一个MATLAB表达式,它创建一个包含两个随机数向量的单元格数组,第二个参数为该函数创建一个MATLAB函数句柄的意思是

"{randn(10,1), randn(20,1)}" "@mean"

示例2

在三个数据集中搜索正数值。第一个参数是包含三个数据集(三个随机数向量)的单元格数组,第二个参数是匿名函数它从输入中提取正数。

cellops”{randn (10, 1), randn(20日1),randn(30日1)}”“@ (x) x (x > 0)”

注意cellops必须是结果非空的MATLAB表达式。如果你输入一个语句,比如X = {23, 17, 81},eval将处理它,但由于MATLAB语句没有结果,您将收到一个错误。

Cellops "x={23,17,81}" "@mean"
???错误:等号左边的表达式不是赋值的有效目标。错误在==> cellops在5

第一次调用eval,Celldata = eval(Celldata);,生成此错误。不可能将不存在的结果赋值给eval对变量celldata

第二个参数cellops是函数句柄。当创建函数句柄with时eval,必须确保函数句柄引用已部署应用程序中包含的函数。一般来说,这意味着您可以使用内装式功能、MATLAB工具箱中的函数、匿名函数和显式添加的函数——一个.我将在后面的帖子中讨论这一点depfun函数。

你的参数不一定是字符串

我希望这些示例演示了如何提高独立可执行文件参数处理的复杂性。即使独立的可执行文件只从命令行接收字符串,您也可以通过几行额外的MATLAB代码将这些字符串转换为许多不同类型的数据。

我给读者留了一个练习:如何将MATLAB结构传递给一个独立的可执行文件?我有一些想法,但没有一个是真正优雅的。




使用MATLAB®7.11发布


  • 打印
  • 发送电子邮件

评论

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