所以我有一个向量 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 并在下一次调用中使用该结果。 如果这是你想要的,那将更加困难。