user2100039
user2100039

Reputation: 1366

MATLAB Merging Arrays

I am unable to figure out how to merge two arrays. My data is like this with arrays A and B.

A = [ 0 0; 0 0; 2 2; 2 2;]

B = [ 1 1; 1 1; 3 3; 3 3; 4 4; 4 4; 5 5; 5 5;]

and I need the final array "C" to look like this after merging:

C = [ 0 0; 0 0; 1 1; 1 1; 2 2; 2 2; 3 3; 3 3; 4 4; 4 4; 5 5; 5 5;]

I've tried using different ways with reshaping each array and trying to use a double loop but haven't got it to work yet.

In my actual data it is inserting 9 rows of array B following 3 rows of array A and then repeated 100 times. So, there are 12 new merged rows (3 rows from array A and 9 rows from array B) repeated 100 times with a final row number == 1200. Array A actual data has 300 rows and actual Array B data has 900 rows

thanks,

Upvotes: 2

Views: 492

Answers (3)

Divakar
Divakar

Reputation: 221684

Approach #1

This could be one approach assuming I got the requirements of the problem right -

%// Inputs
A = [ 6 6; 3 3; 5 5; 4 4;];
B = [ 0 0; 21 21; 17 17; 33 33; 29 29; 82 82;];

%// Parameters that decide at what intervals to "cut" A and B along the rows
A_cutlen = 2; %// Edit this to 3 for the actual data
B_cutlen = 3; %// Edit this to 9 for the actual data

%// Cut A and B along the rows at specified intervals into 3D arrays
A3d = permute(reshape(A,A_cutlen,size(A,1)/A_cutlen,[]),[1 3 2])
B3d = permute(reshape(B,B_cutlen,size(B,1)/B_cutlen,[]),[1 3 2])

%// Vertically concatenate those 3D arrays to get a 3D array
%// version of expected output, C
C3d = [A3d;B3d]

%// Convert the 3D array to a 2D array which is the final output
C_out = reshape(permute(C3d,[1 3 2]),size(C3d,1)*size(C3d,3),[])

Sample run -

A =
     6     6
     3     3
     5     5
     4     4
B =
     0     0
    21    21
    17    17
    33    33
    29    29
    82    82
A_cutlen =
     2
B_cutlen =
     3
C_out =
     6     6
     3     3
     0     0
    21    21
    17    17
     5     5
     4     4
    33    33
    29    29
    82    82

Approach #2

Just for the love of bsxfun, here's one approach with it and ones (no reshape or permute) -

%// Assuming A_cutlen and B_cutlen decide cutting intervals for A and B
%// Concatenate A and B along rows
AB = [A;B]

%// Find the row indices corresponding to rows from A and B to be placed
%// according to the problem requirements
idx1 = [1:A_cutlen size(A,1)+[1:B_cutlen]]
idx2 = [A_cutlen*ones(1,A_cutlen) B_cutlen*ones(1,B_cutlen)]
idx = bsxfun(@plus,idx1(:),idx2(:)*[0:size(A,1)/A_cutlen-1])

%// Re-arrange AB based on "idx" for the desired output
C = AB(idx,:)

Upvotes: 3

beaker
beaker

Reputation: 16810

Here's a solution using only reshape:

A = [ 6 6; 3 3; 5 5; 4 4;]
B = [ 0 0; 21 21; 17 17; 33 33; 29 29; 82 82;]

A_count = 2;
B_count = 3;

w = size(A,2); %// width = number of columns

Ar = reshape(A,A_count,w,[]);
Br = reshape(B,B_count,w,[]);

Cr = [Ar;Br];
C = reshape(Cr,[],w)

The [] in reshape means "how ever many you need to get to the total number of elements". So if we have 12 elements in B and do:

Br = reshape(B,3,2,[]);

We're reshaping B into a 3x2xP 3-dimensional matrix. Since the total number of elements is 12, P = 2 because 12 = 3x2x2.

Output:

A =

   6   6
   3   3
   5   5
   4   4

B =

    0    0
   21   21
   17   17
   33   33
   29   29
   82   82

C =

    6    6
    3    3
    0    0
   21   21
   17   17
    5    5
    4    4
   33   33
   29   29
   82   82

Upvotes: 3

andrew
andrew

Reputation: 2469

based on your new criteria this is what you want. My solution isn't the nicest looking (maye someone can think of a nice vectorized approach), but it works

a_step = 2;
b_step = 3;

C = zeros(size([A;B]));

%we use two iterators, one for each matrix, they must be initialized to 1
a_idx = 1;
b_idx = 1;

%this goes through the entire c array doing a_step+b_step rows at a
%time
for c_idx=1:a_step+b_step :size(C,1)-1
    %this takes the specified number of rows from a
    a_part = A(a_idx:a_idx+a_step-1,:);

    %tkaes the specified number of rows from b
    b_part = B(b_idx:b_idx+b_step-1,:);

    %combines the parts together in the appropriate spot in c
    C(c_idx:c_idx + a_step + b_step -1,:) = [a_part;b_part];

    %advances the "iterator" on the a and b matricies
    a_idx = a_idx + a_step;
    b_idx = b_idx + b_step;
end

using

A = [ 6 6; 3 3; 5 5; 4 4;]
B = [ 0 0; 21 21; 17 17; 33 33; 29 29; 82 82;]

produces

C =[6 6; 3 3; 0 0; 21 21; 17 17; 5 5; 4 4; 33 33; 29 29; 82 82;]

Upvotes: 0

Related Questions