单独行矩阵的排列

时间:2015-06-03 10:09:56

标签: matlab matrix vectorization

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

addView

示例:

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

产生以下矩阵pR:

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]

3 个答案:

答案 0 :(得分:3)

使用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)替换为repmatrepmat([1:m]',[1 n])meshgridmeshgrid(1:m,1:n).'

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

你可以使用arrayfun来避免循环,但如果它是矢量化的原因,可能不会获得性能提升:

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