Octave/MATLAB:变量作用域和名称查找



所以我有一个向量 X 的单元格数组:

octave:149> X
X = 
{
  [1,1] =
      1   17   20
  [2,1] =
      5   20   22   27
  [3,1] =
      2   17   18   21
}

我创建一个空向量 Y:

octave:150> Y = []
Y = [](0x0)

然后,我对 X 的每个值调用一个匿名函数,"Y = unique([Y x])":

octave:151> cellfun(@(x)(Y = unique([Y x])),X,'UniformOutput',false)
ans = 
{
  [1,1] =
      1   17   20
  [2,1] =
      1    5   17   20   22   27
  [3,1] =
      1    2    5   17   18   20   21   22   27
}

好的,但现在 Y 仍然是空的:

octave:152> Y
Y = [](0x0)
octave:153> 

显然,匿名函数中的 Y 名称为其自己的 Y 版本创建并绑定了一个新的存储。

Octave/MATLAB 中的存储和名称解析规则是什么? 何时为变量分配存储? 两个相同的名称何时绑定到同一变量? (有没有办法影响上述匿名函数中 Y 的值?

在 Matlab 中,函数有自己的作用域。 传递变量时,除非该变量也在输出列表中,否则被调用的函数不会修改它;该函数创建变量的副本,副本是函数修改的内容。

对于匿名函数,变量在函数声明时被复制。 请参阅此 Matlab 文档。 这就是你在 Y 上看到的。

另外,我认为您错误地使用了cellfun。 您不应该在调用 cellfun 时返回匿名函数的值,而应该作为 cellfun 的结果返回。

所以,也许这更接近你想要的:

octave:151> Y = cellfun(@(x, y)(unique([y x])),X,Y,'UniformOutput',false)

我无法判断您是否希望每次调用匿名函数的结果更改 Y 并在下一次调用中使用该结果。 如果这是你想要的,那将更加困难。

最新更新