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

Octave/MATLAB:变量范围和名称查找?,matlab,octave,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=unique([yx])”: 好的,但是现在Y仍然是空的: octave:1

我有一个向量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([yx])”:

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

octave:152> Y
Y = [](0x0)
octave:153> 
显然,匿名函数中的Y名称为自己的Y版本创建并绑定了一个新存储


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

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

对于匿名函数,变量在函数声明时复制。看见这就是你在Y身上看到的

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

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

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

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

我正在尝试“并集”单元格数组中的向量。最后Y应该等于
[1 2 5 17 18 20 21 22 27]
,也就是说,我想得到单元数组中向量的集合并集。如果不需要中间步骤的集合并集就是您所需要的,您可以使用以下命令:
Y=unique([X{:}])
。这利用了Matlab可以从中创建数组的事实。此解决方案假设单元内的所有向量都是
1xn
octave:151> Y = cellfun(@(x, y)(unique([y x])),X,Y,'UniformOutput',false)