将数组嵌入另一个数组中

时间:2017-05-25 13:29:09

标签: matlab vectorization

我有两个数组。第一个是连续的顺序,如:

  seq1 =

 1     0
 2     0
 3     0
 4     0
 5     0
 6     0
 7     0
 8     0
 9     0
10     0 
...continues

第二个是:

  seq2 =

 2   250
 3   260
 5   267
 6   270
 8   280
10   290
13   300
18   310
20   320
21   330 
...continues

我需要将seq2嵌入到seq1中,以便最终得到序列:

  seq3 =

 1     0
 2   250
 3   260
 4   260
 5   267
 6   270
 7   270
 8   280
 9   280
10   290
11   290
... continues

我可以用循环来做这个但是数组真的很大所以我不想使用两个for循环,这花费的时间太长了。我怎样才能以矢量化的方式做到这一点?

2 个答案:

答案 0 :(得分:2)

我认为这可以满足您的需求:

[~, jj, vv] = find(sum(bsxfun(@le, seq2(:,1), seq1(:,1).'), 1));
seq3 = seq1;
seq3(jj,2) = seq2(vv,2);

如何运作

通过计算seq2的第一列中有多少值小于或等于第一列中的每个值或seq1(代码sum(bsxfun(@le, ...), 1))来获得所需索引。这将用于从seq2的第二列中选择适当的条目并将其写入结果。但在此之前,需要丢弃此索引中的值0。这是使用find的三输出版本(代码[~, jj, vv] = find(...))完成的。

答案 1 :(得分:2)

如果您的第二列数据总是在增加,您可以使用accumarraycummax轻松解决此问题:

seq = [seq1; seq2];
seq3 = cummax(accumarray(seq(:, 1), seq(:, 2), [], @max));
seq3 = [(1:numel(seq3)).' seq3];

以下是您的样本输入所得到的内容:

seq3 =

     1     0
     2   250
     3   260
     4   260
     5   267
     6   270
     7   270
     8   280
     9   280
    10   290
    11   290
    12   290
    13   300
    14   300
    15   300
    16   300
    17   300
    18   310
    19   310
    20   320
    21   330

工作原理......

连接seq1seq2后,accumarray会收集第二列中第一列中具有相同值的所有值(即值[0 250] { {1}}),然后获取每组的maximum value。然后使用函数2用前一个非零值填充任何零值。最后,索引列将添加到新序列中。