5
votes

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.

5

5 Answers

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

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
1
votes

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.

0
votes

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!

0
votes

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