使用evalin评估基础工作区中的函数

时间:2014-08-15 03:00:35

标签: matlab function

我正在尝试允许函数使用evalin函数访问基本工作区,但我遇到了麻烦。这是一个简单的例子:

我的主要代码:

A = 1;

B = 2
evalin('base','[ C ] = FUN(B)');

C

我的功能:

function [C ] = FUN( B )

     C = A + B;

end

我的错误:

Undefined function or variable 'A'.

Error in FUN (line 4)
C = A + B;

Error in Test (line 4)
evalin('base','[ C ] = FUN(B)');

因此,该函数未在基础工作区中进行评估,因为它不知道A的值是什么。

有人能提出什么建议吗?我有很多变量需要在几个函数中访问,我不想传递它们而且我不想使用全局变量。

谢谢!

2 个答案:

答案 0 :(得分:3)

来自evalin文档,

evalin(ws,expression)在工作空间ws的上下文中执行表达式,这是一个包含任何有效MATLAB®表达式的字符串。 ws可以具有'base'或'caller'值来表示MATLAB基础工作空间或调用函数的工作空间。

所以代码行

evalin('base','[ C ] = FUN(B)');

仅评估代码行

[ C ] = FUN(B)

base 工作空间的上下文中。它不会在 base 工作空间的上下文中评估函数体。所以你所观察到的错误是有道理的。

您是否有特殊原因要将变量传递给函数?为什么在基础(?)工作区中有几个变量,或者你在主函数中只有几个变量?

如果是后者,您可以使用嵌套函数来访问调用者(函数)工作空间中声明的变量。例如,假设您有一个像

这样的主函数
function main()

    A = 1;
    B = 2;

    C = FUN();

    function [C] = FUN()
        C = A + B;
    end
end

函数FUN可以访问AB,因此您无需传入任何参数。


传递几个不同输入的替代方法是传入一个结构,该结构具有您的函数可以随意访问的不同字段。使用上面的示例,我们可以执行以下操作

function main()

    A = 1;
    B = 2;

    data.A = A;
    data.B = B;

    C = FUN(data);


end

function [C] = FUN(data)
    C = data.A + data.B;
end

在这种情况下,函数FUN可以是其自己文件中的函数,也可以是main之后的函数。同样,我们只传入一个包含函数所需数据的参数。

答案 1 :(得分:0)

实际上,Evalin函数用于从基础工作区获取数据:

语法是:

function [out1 out2 out3]=main_fun(in1,in2)
out1=in1+in2;
out2=in1-in2;
in3=evalin('base','in3');
in4=evalin('base','in4');
out3=in3+in4;

end

在函数中使用了Evalin函数。

例如,请参阅以下功能

array1 = [{"name"=>"Bob"}, {"age"=>"30"}]

这里out3值将包含工作空间中in3和in4的总和。 out1和out2将具有当前函数工作空间中in1和in2的和与差。