如何有效地矢量化以下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]
答案 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)
替换为repmat
:repmat([1:m]',[1 n])
或meshgrid
:meshgrid(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))