按照列向量的元素对矩阵行重新排序

时间:2017-06-23 19:24:57

标签: matlab performance matrix

我在维度A的MATLAB中有一个向量(M*N)x2,在第一列中按升序从1M报告每个重复{{1} }次,在第二列中有一些随机数。

,例如NM=4

N=3

然后我有一个维度A=[1 0.1; 1 0.2; 1 0.3; 2 0.4; 2 0.5; 2 0.6; 3 0.7; 3 0.8; 3 0.9; 4 1.1; 4 1.2; 4 1.3]; 的三维矩阵C,其中(M*N)x2xRC(:,:,h)作为第一列,第二列有一些随机数,任何{{ 1}}。

,例如A(:,1)

h=1,...,R

然后,我有一个维度为R=2的向量C(:,:,1)=[1 1.4; 1 1.5; 1 1.6; 2 1.7; 2 1.8; 2 1.9; 3 2.1; 3 2.2; 3 2.3; 4 2.4; 4 2.5; 4 2.6]; C(:,:,2)=[1 2.7; 1 2.8; 1 2.9; 2 2.10; 2 2.11; 2 2.12; 3 2.13; 3 2.14; 3 2.15; 4 2.16; 4 2.17; 4 2.18]; B 报告可能重复的随机顺序中的M个数字

如,

Mx1

我想按照{1,...M}中元素的顺序重新排序B=[3;4;2;2] A:更确切地说,在上面的示例中,我想首先列出{{1}的所有行以C开头,B的所有行以A开头等,与3类似。

A

我现在正在做的是:

4

然而,CA_reordered=[3 0.7; 3 0.8; 3 0.9; 4 1.1; 4 1.2; 4 1.3 2 0.4; 2 0.5; 2 0.6; 2 0.4; 2 0.5; 2 0.6] C_reordered(:,:,1)=[3 2.1; 3 2.2; 3 2.3; 4 2.4; 4 2.5; 4 2.6; 2 1.7; 2 1.8; 2 1.9; 2 1.7; 2 1.8; 2 1.9]; C_reordered(:,:,2)=[3 2.13; 3 2.14; 3 2.15; 4 2.16; 4 2.17; 4 2.18; 2 2.10; 2 2.11; 2 2.12; 2 2.10; 2 2.11; 2 2.12]; 大的速度很慢。如何提高此操作的速度?

修改 我想到了这个

 A_reordered=zeros(N*M,2);
 C_reordered=zeros(N*M,2,R); 
 for m=1:M
     A_reordered((m-1)*N+1:m*N,:)=A(A(:,1)==B(m),:);
     for r=1:R
         C_reordered((m-1)*N+1:m*N,:,r)=C(C(:,1,r)==B(m),:,r); 
     end
 end

你有更快的建议吗?

1 个答案:

答案 0 :(得分:3)

您无需使用find。您可以使用NB计算所需的索引。您可以使用bsxfun来加快速度。

idx = bsxfun(@plus, 1:N, N*(B-1)).';

然后做任何你喜欢的事,例如

A_reordered=A(idx(:),:);
C_reordered=C(idx(:),:,:);