我在foo
中定义了一个函数foo.m
。该函数采用索引i
,访问数组x(i)
的值x
,对其进行一些计算,最后返回结果。数组x
已在文件main.m
中初始化。
在没有真正传递数组的情况下,有没有办法在函数foo
中访问数组?
答案 0 :(得分:2)
这绝对是不好的做法 ...但您可以在x
中将main.m
定义为global
,然后在foo.m
<中使用它/ p>
main.m
function [] = main()
%[
global x;
x = [72 5 8 42];
y = foo(4);
disp(y);
%]
end
foo.m
function [y] = foo(i)
%[
global x;
y = x(i);
%]
end
同样,这是不好的做法,如果可以,我强烈建议您避免这样做,并选择重构您的代码。
旁注 ...我的观点是,始终存在一个避免global
变量的解决方案...如果您的问题过于简单,并且您想知道如何传递吨数main.m
内的参数与foo.m
之类的子函数不会一直传递它们,您可以将它们放在structure
中,这样您只需要传递1个参数:
function [] = main()
%[
% Parameters
parameters.x = [7 5 8 42];
parameters.window = "Hamming";
...
% Computations
y = foo(i, parameters);
%]
end
function [y] = foo(i, parameters)
%[
y = parameters.x(i);
%]
end
同样,这一切都取决于您的情况,但请考虑在使用之前检查您的代码结构 global
。
答案 1 :(得分:2)
是的。该解决方案称为全局变量,几乎在所有情况下都不推荐使用。我强烈建议您继续通过参数将向量传递给foo。全局变量并非邪恶,但它们可能会造成严重的麻烦。 Matlab实际上已经尝试使全局变量更容易使用,但是不可能解决所有可能导致的问题。我刚读了一篇关于那个的好article。
这可能导致问题的最简单的情况是修改此函数中的x。其他用户需要深入研究foo
的代码才能理解会发生什么。如果foo执行高级数学计算并且函数是200行,那该怎么办呢?
在使用全局之前。首先你需要问问自己,所有函数真的需要访问这个变量吗?
我认为你给出的例子不是你遇到的真正问题,因为可以用
完成同样的事情x = [1,2,3,4];
idx = 3;
x3 = x(3);
所以可能还有其他原因要使用全局。但是,使用全局变量来强制不使用参数传递函数并不是一个好理由(抱歉)。使用参数对于阅读代码的任何其他人都是有利的,因为它有助于添加功能描述。例如。 “此函数返回可传递给函数的向量的索引”。然后,理解函数的功能将非常容易。