是否有任何方法错误:() - 索引必须出现在索引表达式的最后?

时间:2015-03-13 21:13:46

标签: matlab

无论出于何种原因,Matlab都不允许重复圆括号() - 迭代器。 这可以阻止直接访问多维数组函数的输出,并使字典对象不可变,以及其他应用程序。

例如,

func1=@(x)[sin(x);cos(x)];
% let S be some large struct where everything is stored
func2=@(str)S.(str);
% let D be some containers.Map object where everything is stored
D(key)=[1;2];

在上述所有3种情况中,能够直接访问数组元素很有用。但是任何一个

func1(Pi)(i); func2(f1)(i); D(key)(i)

将导致错误

()-indexing must appear last in an index expression.

除了创建临时变量之外还有其他吗?

同样,如果您的答案是临时变量是唯一的方法,您是否愿意告诉我第二个变量的创建是否会导致内存中数据的重复?

2 个答案:

答案 0 :(得分:4)

  1. 对于第一个函数you could use getfield(但getfield的使用是not documented,所以我不推荐它:

    >> func1 = @(x) [sin(x); cos(x)];
    >> func1(4.8)
    ans =
       -0.9962
        0.0875
    >> getfield(func1(4.8), {1})
    ans =
       -0.9962
    

    或者您可以定义索引函数来提取所需的元素:

    >> index = @(x,n) x(n);
    >> index(func1(4.8), 1)
    ans =
       -0.9962
    

    另一种可能性是将func1定义为(单元格) - 函数列表,而不是数组值函数,以便您可以单独引用每个值:

    >> func1 = {@(x) sin(x), @(x) cos(x)};
    >> func1{1}(4.8)
    ans =
       -0.9962
    
  2. 对于第二个函数,上述前两种方法适用:

    >> S.fieldA = [11 22 33];
    >> func2 = @(str) S.(str);
    >> getfield(func2('fieldA'), {3})
    ans =
         33
    >> index(func2('fieldA'), 3)
    ans =
         33
    
  3. 对于containers.Map,两次应用getfield似乎也有效(再次,我不推荐):

    >> D = containers.Map({'abc', 'def'}, {10, [20 30]});
    >> getfield(getfield(D,{'def'}), {2})
    ans =
        30    
    

    或者使用索引功能:

    >> index(D('def'), 2)
    ans =
        30
    
  4. 我建议使用索引功能方法,这是安全且通用的。

答案 1 :(得分:1)

我相信有一种方法,它就在SO:this question。 但是,就像评论所说的那样,它非常难看,而且临时变量方式更具可读性。

至于您的后续问题,通常将相同的数组分配给不同的变量不会生成深层副本,只会重复引用。在您使用复制的引用修改数组之前,这一点都适用,此时Matlab会介入并执行深层复制。有关该主题,请参阅this Mathworks article