首页 > 解决方案 > 如何将对象作为参数传递给 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????

标签: functionmatlabobjectoopanonymous-function

解决方案


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

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


推荐阅读