Embedding an array into another: vectorization method

I have two arrays. The first one is a consecutive sequential one, like:
seq1 =
1 0
2 0
3 0
4 0
5 0
6 0
7 0
8 0
9 0
10 0
...continues
The second one is like:
seq2 =
2 250
3 260
5 267
6 270
8 280
10 290
13 300
18 310
20 320
21 330
...continues
I need to embed `seq2` into `seq1` in such a way that I end up with the sequence:
seq3 =
1 0
2 250
3 260
4 260
5 267
6 270
7 270
8 280
9 280
10 290
11 290
... continues
I could do this with loops but the arrays are really big so I don't want to use two `for` loops, it is taking too long. How can I do this in a vectorised manner?

2 comentarios

dpb
dpb el 25 de Mayo de 2017
What are p, q, r, ... ? Constants, additional vectors, ... ?
Tanmay
Tanmay el 25 de Mayo de 2017
Editada: Tanmay el 25 de Mayo de 2017
Constant numbers. I've edited the question so its clearer.

Iniciar sesión para comentar.

 Respuesta aceptada

Andrei Bobrov
Andrei Bobrov el 25 de Mayo de 2017
Editada: Andrei Bobrov el 25 de Mayo de 2017
seq1 = (1:10);
seq2 = {2,'p';5,'q';7,'r';10,'s';33,'t'};
n = [seq2{:,1}]';
s = seq1(:);
i0 = (min(min(s),min(n)):max(max(s),max(n)))';
[l0,ii] = ismember(i0,n);
idx = cumsum(l0);
t = idx ~= 0;
out = num2cell(i0);
out(t,2) = seq2(idx(t),2);
out(~t,2) = {0};
ADD
A = [
1 0
2 0
3 0
4 0
5 0
6 0
7 0
8 0
9 0
10 0 ];
B = [
2 250
3 260
5 267
6 270
8 280
10 290
13 300
18 310
20 320
21 330 ];
Z = (min([A(:,1);B(:,1)]):max([A(:,1);B(:,1)]))';
l0 = ismember(Z,B(:,1));
ii = cumsum(l0);
t = ii ~= 0;
Z(t,2) = B(ii(t),2);

Más respuestas (1)

Stephen23
Stephen23 el 25 de Mayo de 2017
Editada: Stephen23 el 25 de Mayo de 2017
One very simple and efficient way is to use interp1 with its previous option:
>> A = [
1 0
2 0
3 0
4 0
5 0
6 0
7 0
8 0
9 0
10 0 ];
>> B = [
2 250
3 260
5 267
6 270
8 280
10 290
13 300
18 310
20 320
21 330 ];
>> Z = A;
>> Z(:,2) = interp1(B(:,1),B(:,2),A(:,1),'previous')
>> Z =
1 NA
2 250
3 260
4 260
5 267
6 270
7 270
8 280
9 280
10 290

2 comentarios

Andrei Bobrov
Andrei Bobrov el 25 de Mayo de 2017
Editada: Andrei Bobrov el 25 de Mayo de 2017
+1
Z = (min([A(:,1);B(:,1)]):max([A(:,1);B(:,1)]))';
Z(:,2) = interp1(B(:,1),B(:,2),Z,'previous');
Tanmay
Tanmay el 25 de Mayo de 2017
Wasn't aware of this function, thank you!

Iniciar sesión para comentar.

Preguntada:

el 25 de Mayo de 2017

Comentada:

el 25 de Mayo de 2017

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by