James Mertz
James Mertz

Reputation: 8789

How do I Combine two equal sized vectors element wise in MatLab?

I have two vectors:

a = [1 3 5 7 9];
b = [2 4 6 8 10];

That I need to combine together element wise. Meaning that I need the first element of vector a, then the first element of vector b, second of a, second of b, and so forth until I get the following:

combined = [1 2 3 4 5 6 7 8 9 10]

How do I do this within MatLab?

Edit

I ran a test of the top three answers (Josh, Marc, & Kronos) and compared the time it took to run them. I ran each 100 times after doing a 10 iteration warmup. The vectors created were exactly the same size in length (16e+6) and were random values ranging from 1 to 100:

Test Results
Test:           Total Time (100 runs):      Avg Time Per Exec:
Josh B          21.3687                     0.2137
Marc C          21.4273                     0.2143
Kronos          31.1897                     0.3119

It appears that both Josh's and Marc's solutions are similar in execution time.

Upvotes: 5

Views: 10590

Answers (5)

James Mertz
James Mertz

Reputation: 8789

This can be done by the following:

a = [1 3 5 7 9];
b = [2 4 6 8 10];
combinedSize = size(a, 2) * 2;

combined(1:2:combinedSize) = a;
combined(2:2:combinedSize) = b;

This is obviously assuming that your vectors are exactly the same size. If by chance you want to merge two vectors that are not the same size then you can do the following:

combinedSize = max(size(a, 2), size(b, 2)) * 2;
combined = NaN(1,combinedSize);
combined(1:2:size(a,2)*2) = a;
combined(2:2:size(b,2)*2) = b;

This will place a NaN for the remaining elements of the smaller vector. For example, given the following sample vectors:

a = [1 3 5 7 9 11];
b = [2 4 6 8];

will result in the combined vector:

combined =

     1     2     3     4     5     6     7     8     9   NaN    11   NaN

Upvotes: 3

Roney Michael
Roney Michael

Reputation: 3994

All the answers above only work if the two vectors have the same number of elements. The following will work even if they have different number of elements:

>> 
A = [1 3 5];
B = [2 4 6 7 8];
C = [1 3 5 7 8];
D = [2 4 6];

AB = nan(1,2*max(numel(A),numel(B)));
CD = nan(1,2*max(numel(C),numel(D)));

AB(2*(1:length(A))) = A;
AB(1+2*(1:length(B))) = B;
CD(2*(1:length(C))) = C;
CD(1+2*(1:length(D))) = D;
>> 
AB = AB(~isnan(AB))
CD = CD(~isnan(CD))

The result would be:

AB =

     1     2     3     4     5     6     7     8


CD =

     1     2     3     4     5     6     7     8

Upvotes: 0

Tanmay Agrawal
Tanmay Agrawal

Reputation: 141

You can also give a try to looping, for example:

a=[1 2 3 4 5];
b=[11 12 13 14 15];

for i = 1:N

{

if (i%2==0)
{ c[i] = b[i]; }
else
{ c[i] = a[i]; }

This shall work!

Upvotes: 0

Marc Claesen
Marc Claesen

Reputation: 17036

Place the vectors below eachother in a matrix and use reshape. For example:

>> A=[1 2 3]

A =

     1     2     3

>> B=[4 5 6]

B =

     4     5     6

>> C=reshape([A;B],1,size(A,2)+size(B,2))

C =

     1     4     2     5     3     6

It's straightforward to generalize to more than 2 vectors.

Upvotes: 1

Joshua Barr
Joshua Barr

Reputation: 396

a = [1 3 5 7 9];
b = [2 4 6 8 10];
temp = [a; b];
combined = temp(:)';

Upvotes: 4

Related Questions