function - 如何将对象作为参数传递给 MATLAB 中的匿名函数?
问题描述
我正在开发一个 MATLAB 应用程序,它以编程方式创建匿名函数来评估任何本机 MATLAB 函数并将变量列表作为参数传递给它。在下面的示例中,'formula' 包含一个字符串,其中包含要计算的函数和参数(例如,“sum( var1, var2 )”)。公式有时包含嵌套在函数调用中的函数调用,因此将递归使用下面的代码,直到获得最终结果:
Func2 = str2func( sprintf( '@(%s) %s', strjoin( varNames, ',' ), formula ) );
这对于本机 MATLAB 函数的计算结果很好。但是有一个函数(名为 Func1)的特殊情况,我让自己不仅需要变量列表,还需要一个对象作为参数,如下所示:
function output = Func1( anObject, varNames )
% do some stuff with the object and the vars
end
对于这个特定的功能,我试过这样做:
Func2 = str2func( sprintf( '@(%s,%s) %s', "objectToPassToFunc1", strjoin( varNames, ',' ), "Func1(objectToPass,""" + strjoin( varNames, '","' ) +""")" ) )
...这不会引发错误,但 Func1 没有收到 objectToPassToFunc1,而是从 varNames 中的变量之一获取值。我不知道为什么。
那么我怎样才能正确地将对象传递给 Func1????
解决方案
Matlab 不关心传递给函数的参数类型。事实上,输入可以是标量、向量、矩阵,甚至是一个类的对象。请参阅以下示例。
classdef ClassA
methods
function print(~)
disp('method print() is called.');
end
end
end
这个类只有一个方法。func
现在,让我们定义一个接受一个输入的匿名函数。
func = @(arg) arg.print;
请注意,我们明确假设输入是 ClassA 的对象。如果向该函数传递另一种类型的数据,Matlab 将抛出错误。要测试代码,
obj = ClassA;
func = @(arg) arg.print;
func(obj)
为避免该错误,您可能需要在使用前检查输入的类型。例如,
function [] = func(arg)
% check if arg is an object of ClassA
if isa(arg,'ClassA')
arg.print;
end
end
现在您可以为输入传递不同的类型而不会出错。
推荐阅读
- c# - c# winforms 如何将form2的mdiParent设置为form1
- java - 使用消息正文的 java 粗体文本发送电子邮件
- numpy - 在布尔表达式中手动广播 numpy?
- json - 使用模板或工具编辑 (conf) json 文件
- vue.js - Vuejs 从扩展组件事件中更新父组件数据
- azure - 如何在 Azure 数据工厂中添加动态连接字符串
- java - 我的数组列表数据未显示在列表视图中仅包名称显示在列表视图中
- java - 在 try-with-resources 中打开连接 - 第二个资源取决于第一个
- javascript - Javascript 上的 mssql 语句
- google-apps-script - 环聊机器人如何在卡片消息中@提及用户