【问题标题】:matlab matrix indexing of multiple columns多列的matlab矩阵索引
【发布时间】:2015-11-08 23:35:31
【问题描述】:

假设我有一个 IxJ 值矩阵,

V= [1,4;2,5;3,6];

和一个 IxR 矩阵 X 的索引,

X = [1 2 1 ; 1 2 2 ; 2 1 2];

我想得到一个矩阵 Vx,它是 IxR,这样对于每一行 i,我想读取 R 乘以(可能)不同的 V 列,这些列由 X 中每个对应列中的数字给出。

Vx(i,r) = V(i,X(i,r)).

例如在这种情况下它会是

Vx = [1,4,1;2,5,5;6,3,6];

非常感谢您快速完成此操作(没有任何循环)的任何帮助!

【问题讨论】:

    标签: performance matlab matrix indexing vectorization


    【解决方案1】:

    您可以使用bsxfun 获得有效的解决方案 -

    N = size(V,1)
    Vx = V(bsxfun(@plus,[1:N]',(X-1)*N))
    

    示例运行 -

    >> V
    V =
         1     4
         2     5
         3     6
    >> X
    X =
         1     2     1
         1     2     2
         2     1     2
    >> N = size(V,1);
    Vx = V(bsxfun(@plus,[1:N]',(X-1)*N))
    Vx =
         1     4     1
         2     5     5
         6     3     6
    

    【讨论】:

      【解决方案2】:

      所以你想要实现的是使用矢量化来实现速度。这是 MATLAB 的主要优势之一。您想要的是一个矩阵(以下代码中的index),其元素是线性索引,将用于从源矩阵中提取值(在您的情况下为V)。前两行代码的作用与sub2ind 完全相同,将下标转换为线性索引。我是这样编码的,这样索引转换的逻辑就很清楚了。

      [m,n] = ndgrid(1:size(X,1),1:size(X,2));
      index = m + (X-1)*size(X,1);
      Vx = V(index);
      

      【讨论】:

        【解决方案3】:

        另一种方法是将repmatsub2ind 结合使用。 sub2ind 接受行和列位置,输出是列主要线性索引,可用于向量化对矩阵的访问。具体来说,您想要构建一个与X 大小相同的行索引和列索引的二维矩阵,其中列索引完全指定为X,但我们关注的每一行的行索引都相同和。具体来说,这个矩阵的第一行全是 1,下一行全是 2,等等。要构建这个行矩阵,首先生成一个列向量,从 1 到与X 一样多的行并复制它与X 中的列一样多。使用这个新矩阵和X,使用sub2ind 生成列主要线性索引,最终索引V 以生成矩阵Vx

        subs = repmat((1:size(X,1)).', [1 size(X,2)]); %'
        ind = sub2ind(size(X), subs, X);
        Vx = V(ind);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-03-26
          • 1970-01-01
          • 2011-12-24
          • 2015-03-10
          • 2014-05-12
          • 2013-09-13
          • 2014-06-08
          • 2017-02-24
          相关资源
          最近更新 更多