矩阵的不同行的排列
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))
如何有效地向量化以下 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))