微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将对象作为参数传递给 MATLAB 中的匿名函数?

如何解决如何将对象作为参数传递给 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","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

现在您可以为输入传递不同类型而不会出错。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。