如何根据另一个矩阵中元素的顺序在Matlab中重新排列矩阵的元素?

时间:2015-03-09 14:15:51

标签: performance matlab matrix

我在尺度A的Matlab中有一个向量(mxn)x1,由大于或等于零的实数组成,例如m=3,n=4 A=[1;0;0;0;0.4;0.7;0.5;0.6;0.8;0;1;6]看起来像

           A=[1
              0 
              0 
              ---
              0 
              0.4 
              0.7 
              ---
              0.5 
              0.6 
              0.8
              ---
              0 
              1 
              6]

我们可以看到A由维度n的{​​{1}}子向量组成。我有一个维度为m的向量Bgx1大于或等于g,由1和0组成,使得1的总数等于{{ 1}},例如m m看起来像

g=9

我想创建一个维度B=[1;0;0;0;0;0;0;1;1]的矩阵B=[1 0 0 0 0 0 0 1 1] ,其中C的每个子向量的条目与每列gxn中的条目相对应例如,A

g

只有在非常快的情况下才能正常循环。矩阵的实际维度非常大(例如B

2 个答案:

答案 0 :(得分:2)

方法#1(bsxfun基于线性索引)

C = zeros(g,n)                         %// Pre-allocate
idx = bsxfun(@plus,find(B),[0:n-1]*g)  %// Indices where A elements are to be put
C(idx)= A                              %// Put A elements

方法#2(直接替换)

C = zeros(g,n) 
C(find(B),:) = reshape(A,m,[])

预分配:对于faster pre-allocation,您可以在上述两种方法中执行此操作 -

C(g,n) = 0;

答案 1 :(得分:1)

您还可以尝试repmat和逻辑索引方法。首先,重新整形数据,使其处于正确的矩阵形式,因此在您的情况下3 x 4,然后使用B作为逻辑掩码,并将其复制多次,就像我们在矩阵中有列一样,然后做一个任务。在执行此分配之前,您必须分配一个与所需输出大小相同的矩阵。像这样:

%// Your example data
m = 3; n = 4;
A = [1;0;0;0;0.4;0.7;0.5;0.6;0.8;0;1;6];
B = logical([1 0 0 0 0 0 0 1 1]).';

%// Relevant code
Am = reshape(A, m, n);
Bm = repmat(B, 1, n);
C = zeros(numel(B), 4);
C(Bm) = Am;

C是理想的结果,我们得到:

C =

    1.0000         0    0.5000         0
         0         0         0         0
         0         0         0         0
         0         0         0         0
         0         0         0         0
         0         0         0         0
         0         0         0         0
         0    0.4000    0.6000    1.0000
         0    0.7000    0.8000    6.0000

我的直觉是,这会比bsxfun方法慢,但如果您不熟悉bsxfun的工作方式,则上述内容更具可读性。