有没有办法解决错误:()-索引必须在索引表达式中最后出现



无论出于何种原因,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.

除了创建一个临时变量之外,还有什么吗?

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

  1. 对于第一个函数,您可以使用getfield(但是没有记录getfield的这种使用,所以我不推荐它):

    >> 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
    

我会推荐索引函数方法,这种方法既安全又通用。

我相信

有一种方法,它就在SO:这个问题上。然而,就像评论说的那样,它非常丑陋,临时变量方式更具可读性。

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

相关内容

最新更新