【问题标题】:Matrix indexing with matrices in MATLAB在 MATLAB 中使用矩阵进行矩阵索引
【发布时间】:2015-07-10 09:01:50
【问题描述】:

我正在尝试从本质上用作查找表的矩阵中提取值。为此,我有一个行坐标矩阵和一个列坐标矩阵。有没有办法可以按如下方式提取值:

A(R, C)

A(R(:), C(:))

例如:

A = [ 1, 2, 3, 4; 
      5, 6, 7, 8; 
      9, 0, 1, 2; 
      3, 4, 5, 6 ];

R = [ 1, 2; 
      1 2];
C = [ 1, 1; 
      1 1];

我想找一些命令让

A(R, C) =

1, 5
1, 5

A(R(:), C(:)) =

1
1
5
5

当你执行这些命令时,实际发生的是你得到了矩阵的每一个排列。所以在我的例子中,你会得到一个由

组成的 4x4 矩阵
A(1,1)  A(1,1)  A(1,1)  A(1,1)
A(1,1)  A(1,1)  A(1,1)  A(1,1)
A(2,1)  A(2,1)  A(2,1)  A(2,1)
A(2,1)  A(2,1)  A(2,1)  A(2,1)

有没有办法对每个索引矩阵/向量进行成对的索引,以便结果显示

A(1,1)  A(2,1)
A(1,1)  A(2,1)

谢谢!

【问题讨论】:

    标签: arrays matlab matrix indexing


    【解决方案1】:

    确实,您指出了 Matlab 索引的一个微妙问题。
    要解决此问题,您需要将行列索引RC 转换为linear indices。一种简单的方法是使用sub2ind

     A( sub2ind( size(A), R, C ) );
    

    这是它的工作原理

    >> A(sub2ind(size(A),R,C))
    ans =
     1     5
     1     5
    
    >> A(sub2ind(size(A),R(:),C(:)))
    ans =
     1
     1
     5
     5
    

    如果您在运行时很紧张并且想避免sub2ind 的开销,您可以自己直接转换索引:

     A( size(A,1)*(C-1)+R )
    

    【讨论】:

    • 太棒了!也谢谢你的解释。这两种单线都运作良好。您能否在答案中解释一下直接索引转换如何工作?这对我来说并不直观
    • 请参阅有关线性索引的所有信息here。 @marcman
    • 啊,明白了。这是有道理的——它本质上是标准(j-1) * d1 + i 偏移的矩阵版本。好答案!
    【解决方案2】:

    您可以使用arrayfun

    >> arrayfun(@(x,y) A(x,y), R, C)
    ans =
         1     5
         1     5
    

    您会得到与RC 大小相同的结果,而不是向量。

    【讨论】:

    • 使用sub2ind 和我建议的直接方法,您可以获得与RC 完全相同的形状的结果 - arrayfun 在这方面没有任何优势。跨度>
    • @Shai,我并不是说比你的解决方案更有优势,但我还是删除了优势这个词。
    猜你喜欢
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    • 2015-06-10
    • 2018-03-26
    • 2013-01-20
    • 2018-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多