我有两个数组。第一个是连续的顺序,如:
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
循环,这花费的时间太长了。我怎样才能以矢量化的方式做到这一点?
答案 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)
如果您的第二列数据总是在增加,您可以使用accumarray
和cummax
轻松解决此问题:
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
连接seq1
和seq2
后,accumarray
会收集第二列中第一列中具有相同值的所有值(即值[0 250]
{ {1}}),然后获取每组的maximum value。然后使用函数2
用前一个非零值填充任何零值。最后,索引列将添加到新序列中。