如何在Matlab中的另一个文件中定义的函数中访问这些变量?

时间:2015-02-27 17:51:16

标签: matlab

我在foo中定义了一个函数foo.m。该函数采用索引i,访问数组x(i)的值x,对其进行一些计算,最后返回结果。数组x已在文件main.m中初始化。

在没有真正传递数组的情况下,有没有办法在函数foo中访问数组?

2 个答案:

答案 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);

所以可能还有其他原因要使用全局。但是,使用全局变量来强制不使用参数传递函数并不是一个好理由(抱歉)。使用参数对于阅读代码的任何其他人都是有利的,因为它有助于添加功能描述。例如。 “此函数返回可传递给函数的向量的索引”。然后,理解函数的功能将非常容易。