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

Function 如何在MATLAB中将对象作为参数传递给匿名函数?,function,matlab,object,oop,anonymous-function,Function,Matlab,Object,Oop,Anonymous Function,我正在开发一个MATLAB应用程序,它通过编程创建匿名函数来评估任何原生MATLAB函数,并将变量列表作为参数传递给它。在下面的示例中,“formula”包含一个字符串,其中包含要计算的函数和参数(例如,“sum(var1,var2)”。公式有时包含嵌套在函数调用中的函数调用,因此在获得最终结果之前,将递归使用下面的代码: Func2 = str2func( sprintf( '@(%s) %s', strjoin( varNames, ',' ), formula ) ); 对于本机MATL

我正在开发一个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

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

您的问题不清楚,而且您所做的工作看起来效率很低。你到底想要什么?你知道feval吗?看起来需要更多的上下文。应用程序查看用户在文本文件中编写的公式列表,然后逐个计算公式。其中一些公式可能包含嵌套函数调用,因此应用程序通过构建匿名函数递归地计算它们。我不理解目标,也不理解问题所在。为什么需要匿名函数来计算函数?为什么传递一个对象与传递任何其他变量有什么不同?@alfavictor这样用户就可以在一个文本文件中编写有效的Matlab公式,因此这是一个有效的Matlab脚本。为什么不这样运行呢?@alfavictor我知道你认为在这种情况下使用匿名函数是正确的,但是如果你把每一行都放到一个匿名函数中,你就隐含地假设该文件是一个有效的Matlab脚本,不管他们是否知道Matlab。如果需要为脚本的运行定义变量,这很容易做到。否则,我同意Cris Luengo的观点,即传递对象和传递参数给函数没有区别,因此不清楚问题是什么。