0

所以我有一个向量 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)

然后我用“Y = unique([Y x])”对 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 的值吗?)

4

1 回答 1

1

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

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

另外,我认为您使用 cellfun 不正确。您不应该在对 cellfun 的调用中返回匿名函数的值,而是作为 cellfun 的结果。

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

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

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

于 2012-05-01T04:58:01.047 回答