所以我有一个向量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的值?)
答案 0 :(得分:1)
在Matlab函数中有自己的范围。传递变量时,除非该变量也在输出列表中,否则被调用的函数不会修改它;该函数创建变量的副本,副本是函数修改的内容。
使用匿名函数,变量将在函数声明中复制。见this Matlab documentation。这就是你所看到的Y。
另外,我认为你错误地使用了cellfun。您不应该在对cellfun的调用中返回匿名函数的值,而应该返回cellfun的结果。
所以,也许这更接近你想要的东西:
octave:151> Y = cellfun(@(x, y)(unique([y x])),X,Y,'UniformOutput',false)
我不知道你是否希望每次调用匿名函数的结果都改变Y并在下一次调用中使用该结果。如果那就是你想要的,那就更难了。