如何初始化变量并在控制台中使用它们?

时间:2012-01-23 23:19:33

标签: matlab octave

例如在testinit.m中我有以下

function [x, y, m] = testinit

x=4
y=3
m=2

当我在控制台中运行testinit时,它会正确显示该值。但是,当我输入x时,它会显示

  

错误:'x'未定义...

5 个答案:

答案 0 :(得分:4)

只是添加上面的答案,你得到这个的原因是因为MatLab函数中的变量是局部变量,除非你使用其中一个函数,否则它们不会传递给工作区在上面的回答中。您可以阅读有关全局和局部变量here的更多信息。

P.S如果您编写的m文件不是函数,则变量是全局的。

答案 1 :(得分:3)

assignin函数(evalin是相关的)。还有global

答案 2 :(得分:2)

如果在控制台中运行[x, y, m] = testinit,则应获取变量。输出变量可以具有任何允许的名称,而不是必需的x,y和m。

此外,您应该在函数中的每个变量赋值之后放置;,以避免它们输出到控制台。您可以在调用函数时控制控制台输出。

如果您只想输入testinit来简单地初始化新变量,请使用@ BenVoigt答案中的assignin

assignin('base','x',4)

但是,这很危险,因为某些变量可能已存在于调用环境中并将被覆盖。您可以避免添加EXIST测试(在EVALIN内部):

function testinit

if ~evalin('base','exist(''x'',''var'')')
    assignin('base','x',4)
end
if ~evalin('base','exist(''y'',''var'')')
    assignin('base','y',3)
end
if ~evalin('base','exist(''m'',''var'')')
    assignin('base','m',2)
end

如果您打算从另一个函数调用该函数,也可以使用'caller'而不是'base'。

答案 3 :(得分:2)

其他答案都是可能的解决方案,但可能比您可能想要的更复杂。我认为yuk's answer的第一部分解决了你遇到的真正问题,但我认为它应该得到更详细的解释......

如果你的函数有output arguments,你需要在调用函数时实际捕获变量中的参数。例如,如果您在命令窗口中键入此内容:

[x, y, m] = testinit;

然后您将有三个输出值供您使用。您可能正在做的是键入:

testinit;

这将显示值(因为您没有使用semicolon to suppress displaying them结束函数中的每一行),但它不会存储它们命令窗口中的变量供您稍后使用。

这是variables如何存储在MATLAB中的结果,如documentation on variable scope所述:

  

MATLAB将变量存储在称为工作空间的内存部分中。 基础工作区包含在交互式MATLAB会话期间创建的变量以及通过运行脚本创建的任何变量。在MATLAB命令提示符下创建的变量也可以由脚本使用,而不必将它们声明为全局变量。

     

函数不使用基础工作区。每个函数都有自己的函数工作区。每个函数工作空间都与基本工作空间和所有其他工作空间分开,以保护该函数使用的数据的完整性。即使在同一文件中定义的子功能也有一个单独的功能工作区。

因此,如果您想在函数之间共享变量,最简单的方法是通过input and output argument lists来回传递它们。

还应该注意,在函数的输出参数列表中给出变量的名称不必与放置这些输出值的变量的名称相匹配。例如,给定此函数:

function [a, b, c] = testinit
  a = 4;
  b = 3;
  c = 2;

您可以在命令窗口中进行此调用:

[x, y, m] = testinit;

您将获得x = 4y = 3m = 2

答案 4 :(得分:1)

变量是函数的本地变量,因此您无法从命令行访问它们。正如@BenVoigt所说,你可以使用asignin,但它非常脏,我认为这不是你真正想做的事。

我建议您进入调试模式

break pointkeyboard添加到您的函数中:

function [x, y, m] = testinit

x=4
y=3
m=2

keyboard

执行完您的功能后,命令行将保留在该功能的环境中。  通常的>> kill被K>>取代。此时,您可以访问所有本地变量。

退出调试模式类型dbquit,或按shift+F5