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

如何访问Matlab中另一个文件中定义的函数中的变量?,matlab,Matlab,我在foo.m中定义了一个函数foo。该函数获取索引i,访问数组x的值x(i),对其进行一些计算,最后返回结果。数组x已在文件main.m中初始化 是否有任何方法可以在函数foo中访问数组而不真正通过数组?这绝对是一种糟糕的做法。。。但是您可以在main.m中定义x,然后在foo.m function [y] = foo(i) %[ global x; y = x(i); %] end main.m function [] = main() %[ global x;

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


是否有任何方法可以在函数
foo
中访问数组而不真正通过数组?

这绝对是一种糟糕的做法。。。但是您可以在
main.m
中定义
x
,然后在
foo.m

function [y] = foo(i)
%[
    global x;
    y = x(i);
%]
end
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
再次强调,这是一种不好的做法,我强烈建议您避免这样做,如果可以的话,选择重构代码

旁注。。。我的观点是,总有一种解决方案可以避免
全局变量。。。如果您的问题过于简单,并且如果您想知道如何将
main.m
中的大量参数传递给子函数,如
foo.m
,而不始终传递它们,那么您可以将它们放在a中,这样您只需要传递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

再次,这完全取决于您的情况,但是<强>请考虑在使用以前的代码结构之前使用< /强> <代码>全局< /代码> .< /P> < P> <强>这是绝对坏的实践<强>…但是您可以在

main.m
中定义
x
,然后在
foo.m

function [y] = foo(i)
%[
    global x;
    y = x(i);
%]
end
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
再次强调,这是一种不好的做法,我强烈建议您避免这样做,如果可以的话,选择重构代码

旁注。。。我的观点是,总有一种解决方案可以避免
全局变量。。。如果您的问题过于简单,并且如果您想知道如何将
main.m
中的大量参数传递给子函数,如
foo.m
,而不始终传递它们,那么您可以将它们放在a中,这样您只需要传递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

再次,这完全取决于您的情况,但是<强>请考虑在使用以前的代码结构之前使用<强> >代码>全局< /代码>。< /P> < P>是的。该解决方案称为全局变量,几乎在所有情况下都不推荐使用。我强烈建议您继续通过参数将向量传递给foo。全局变量不是邪恶的,但它们会造成严重的麻烦。Matlab实际上试图使globals更易于使用,但不可能解决它可能导致的所有问题。我刚刚读了一篇关于这方面的好文章

最简单的情况是,如果您在这个函数中修改了x,那么就会出现问题。其他用户需要深入了解
foo
的代码才能理解发生了什么。如果foo执行高级数学计算,并且函数有200行长,该怎么办

在您使用全局搜索之前。首先你需要问自己,所有函数真的需要访问这个变量吗?

我认为你给出的例子不是你真正的问题,因为同样的问题可以通过

x = [1,2,3,4];
idx = 3;
x3 = x(3);

因此,可能还有另一个原因,您希望使用全局。但是,使用globals不强制传递带有参数的函数不是一个很好的理由(对不起)。使用参数对于阅读代码的任何其他人来说都是一个优势,因为它有助于添加函数描述。例如,“此函数返回可传递给函数的向量的索引”。这样就很容易理解函数的功能了。

是的。该解决方案称为全局变量,几乎在所有情况下都不推荐使用。我强烈建议您继续通过参数将向量传递给foo。全局变量不是邪恶的,但它们会造成严重的麻烦。Matlab实际上试图使globals更易于使用,但不可能解决它可能导致的所有问题。我刚刚读了一篇关于这方面的好文章

最简单的情况是,如果您在这个函数中修改了x,那么就会出现问题。其他用户需要深入了解
foo
的代码才能理解发生了什么。如果foo执行高级数学计算,并且函数有200行长,该怎么办

在您使用全局搜索之前。首先你需要问自己,所有函数真的需要访问这个变量吗?

我认为你给出的例子不是你真正的问题,因为同样的问题可以通过

x = [1,2,3,4];
idx = 3;
x3 = x(3);

因此,可能还有另一个原因,您希望使用全局。但是,使用globals不强制传递带有参数的函数不是一个很好的理由(对不起)。使用参数对于阅读代码的任何其他人来说都是一个优势,因为它有助于添加函数描述。例如,“此函数返回可传递给函数的向量的索引”。这样就很容易理解函数的功能了。

no。这就是所谓的。除非您在函数外部声明该数组,以便在定义另一个函数时它是可见的,否则您无法按要求执行操作。顺便说一句,请原谅我的提问,但是当您可以自己使用本机索引访问元素时,为什么还要编写一个从给定索引的数组返回元素的函数呢?这看起来非常模糊和缓慢。
foo
访问
x(i)
,对其进行一些计算,然后返回结果。为了简洁起见,我跳过了这些细节。你应该考虑把这个添加到你的问题声明中,避免其他人得出错误的结论(比如我)。我还想补充一个在MATLAB中声明为全局的变量真的是全局的。您运行的程序不仅是全局的,而且