Octave / MATLAB:可变范围和名称查找?

时间:2012-05-01 04:14:08

标签: matlab octave

所以我有一个向量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 =唯一([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的值?)

1 个答案:

答案 0 :(得分:1)

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

使用匿名函数,变量将在函数声明中复制。见this Matlab documentation。这就是你所看到的Y。

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

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

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

我不知道你是否希望每次调用匿名函数的结果都改变Y并在下一次调用中使用该结果。如果那就是你想要的,那就更难了。