我正在尝试允许函数使用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的值是什么。
有人能提出什么建议吗?我有很多变量需要在几个函数中访问,我不想传递它们而且我不想使用全局变量。
谢谢!
答案 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
可以访问A
和B
,因此您无需传入任何参数。
传递几个不同输入的替代方法是传入一个结构,该结构具有您的函数可以随意访问的不同字段。使用上面的示例,我们可以执行以下操作
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的和与差。