矩阵的不同行的排列

permutation of separate rows of matrix

如何有效地向量化以下 MATLAB 代码,该代码通过矩阵 P 的相应行中的索引对矩阵 R 的每一行执行排列?

for i = 1:size(P,1)
   pP(i,:) = R(i,P(i,:));
end

示例:

P = [3     2     1;
     3     1     2;
     2     3     1;
     2     1     3;
     1     2     3;
     1     3     2]

R = [6     5     4;
     6     4     5;
     5     6     4;
     5     4     6;
     4     5     6;
     4     6     5]

生成以下矩阵 pR:

     4     5     6
     5     6     4
     6     4     5
     4     5     6
     4     5     6
     4     5     6

一种方法 bsxfun -

nrows = size(R,1)
pP = R(bsxfun(@plus,[1:nrows]',(P-1)*nrows))

或者用 ndgrid -

[m,n] = size(R)
pP = R(sub2ind([m n],ndgrid(1:m,1:n),P))

或将ndgrid(1:m,1:n)替换为repmat: repmat([1:m]',[1 n]) or with meshgrid:meshgrid(1:m,1:n).'.

这可能不是最好的方法,但您可以这样做:

IND1 = P(:,1)
Q(:,1) = diag(R(:,IND));

并以类似的方式对 P(:,2)、P(:,3) 重复。

您可以使用 arrayfun 来避免循环,但如果这是对其进行矢量化的原因,则可能不会提高性能:

cell2mat(arrayfun(@(k) R(k, P(k,:)), (1:size(P,1)).', 'uni', 0))