我在维度A
的MATLAB中有一个向量(M*N)x2
,在第一列中按升序从1
到M
报告每个重复{{1} }次,在第二列中有一些随机数。
,例如N
和M=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)x2xR
有C(:,:,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
然而,C
和A_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
你有更快的建议吗?
答案 0 :(得分:3)
您无需使用find
。您可以使用N
和B
计算所需的索引。您可以使用bsxfun
来加快速度。
idx = bsxfun(@plus, 1:N, N*(B-1)).';
然后做任何你喜欢的事,例如
A_reordered=A(idx(:),:);
C_reordered=C(idx(:),:,:);