【问题标题】:Octave/MATLAB: Variable Scopes and Name Lookup?Octave/MATLAB:变量范围和名称查找?
【发布时间】:2012-05-01 12:58:01
【问题描述】:

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

【问题讨论】:

    标签: matlab octave


    【解决方案1】:

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

    对于匿名函数,变量在函数声明时被复制。见this Matlab documentation。这就是你在 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 可以从comma-seperated lists 创建数组的事实。此解决方案假定单元格内的所有向量都是1xn
    猜你喜欢
    • 2016-06-25
    • 1970-01-01
    • 2020-01-07
    • 1970-01-01
    • 2018-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多