这可能是组织函数之间数据传输的最糟糕的方式之一。功能工作区分开是有充分理由的,以保持工作干净整洁。
您正试图绕过设计该语言(以及共享这种工作空间/范围分离的许多其他语言)的人所设置的所有安全措施。 Matlab 中提供了这些“旁路”函数,以便您在进行原型设计时能够准时使用。它们不适合大量使用或最终解决方案(其中大多数实际上无法编译)。
It is
- 可能会非常令人困惑(稍后对您来说,但如果其他人必须使用您的代码,情况会更糟)。
- 很难调试(你几乎have提前知道变量的值,以了解从另一个工作区导入是否正确)。
您在评论中说,由于变量的数量,将变量作为参数传递很复杂,但是每次您调用类似的东西时x = evalin('caller', 'x');
无论如何,你必须编写一整行代码才能检索你的值。进而assignin('caller', 'x', x);
是另一行代码将其发送回来......这太疯狂了。
难道不是更简单(也更短)吗?x
在你的函数输入参数中? (输入 100 个变量仍然比使用 200 整行代码从不确定位置检索然后重新发送这些值要快).
推荐(如果可行):在参数中传递变量
为了使变量传递变得容易,您可以将它们全部收集在一个structure http://mathworks.com/help/matlab/structures.html (or a cell array http://mathworks.com/help/matlab/cell-arrays.html):
[v1, v2] = deal(1, 1);
myVars.v1 = v1 ;
myVars.v2 = v2 ;
myVars = f11(myVars); %// you only have one variable to pass into your functions
myVars = f12(myVars); %// just make sure you retrieve it in output too
disp(myVars.v1);
And then
function myVars = f11()
myVars = f2(myVars);
end
依此类推,只要将变量传递给下一个函数,然后在输出中检索它,这将适用于任何级别的递归。
推荐(如果以上不可能):使用nested功能
如果你定义你的函数f11()
inside your f0()
,两个函数中具有相同名称的变量将被共享(在两个级别都可见)。阅读documentation http://uk.mathworks.com/help/matlab/matlab_prog/nested-functions.html#f4-73993了解更多详情。这样您就不需要多次致电evalin/assignin
因为变量到处都是已知的。你的函数必须写成这样的形式:
function f0()
[v1, v2] = deal(1, 1);
f11();
f12();
disp(v1);
function f11()
f2();
function f2()
if v2 == 1
v1 = v1 + 1;
end
end
end %// END function F11
function f12()
f2();
function f2()
if v2 == 1
v1 = v1 + 1;
end
end
end %// END function F12
end %// END function F0
Stack Exchange 不会渲染它,但在 Matlab 编辑器中,您可能会注意到“共享”变量将以不同的颜色突出显示(以提醒您它们的范围与标准变量不同)。
如果我跑f0()
我确实得到:
>> f0
3
这是预期的结果。正如您所看到的,唯一的缺点是如果您打电话f2()
从内部f11()
and f12()
, 功能f2()
必须写在每个文件中(因此需要进行一些复制/粘贴)。除非在这个递归级别,您没有太多变量需要传递,所以您可以考虑编写f2()
在侧面并使用标准变量传递方案。
可以工作,但不推荐
现在,如果您仍然热衷于编写大量代码来传递单个变量,那么仍然有 2 个选择:
- use global http://mathworks.com/help/matlab/ref/global.html变量
- use setappdata http://uk.mathworks.com/help/matlab/ref/setappdata.html and getappdata http://uk.mathworks.com/help/matlab/ref/getappdata.html
我不喜欢用global
所以我这里就不详细说了。只要记住变量真的是global
它必须声明为global
in every函数在使用的地方。
For the appdata
方法,您需要一个“容器”,您的所有功能都可以访问它。您可以使用“根”对象(标识符: 0
).
例如,当你想存储一个变量时,你可以使用:
setappdata( 0 , 'v2' , v2 ) %// store the value of `v2` in a field named `'v2'` in the root object.
然后在您的任何函数中,获取值,对其进行处理,然后将其存储回来:
function f2()
v1 = getappdata(0,'v1') %// get the value of v1
v2 = getappdata(0,'v2') %// get the value of v2
if v2 == 1
v1 = v1 + 1; %// modify the value of v1
end
v1 = setappdata(0,'v1',v1) %// store the value of v1
end
在您的基本函数中应用相同的原则并f11()
, f12()
等等...只要记住在修改后始终将任何值存储回来,以便它可用于下一个需要它的函数。