2015-04-14 3 views
2

Я не могу понять, как объединить два массива. Мои данные, как это с массивами A и B.MATLAB Merging Arrays

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;] 

и мне нужно окончательный массив «C», чтобы выглядеть после слияния:

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;] 

Я попытался с помощью различных способов с перестройки каждый массив и пытается использовать двойной цикл, но еще не получил его на работу.

В моих фактических данных он вставляет 9 строк массива B, следующих за 3 строками массива A, а затем повторяется 100 раз. Итак, есть 12 новых объединенных строк (3 строки из массива A и 9 строк из массива B), повторяющихся 100 раз с окончательным номером строки == 1200. Массив. Фактические данные имеют 300 строк, а фактические данные массива B имеют 900 строк.

спасибо,

+0

Что критерии объединяющиеся? – Divakar

+1

Вы просто сортируете строки? – beaker

+0

Я просто сортирую строки, чтобы получить один окончательный объединенный массив («С») выше. спасибо, – user2100039

ответ

3

Вот решение, используя только 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) 

[] в RESHAPE означает «как никогда много вам нужно получить к общему числу элементов». Так что, если у нас есть 12 элементов в B и сделать:

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

Мы B изменения формы в 3x2xP 3-мерной матрицы. Так как общее число элементов равно 12, P = 2, потому что 12 = 3x2x2.

Выход:

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 
+0

hi - в чем смысл «2» в аргументе reshape и [] закрытых скобках, что означает аргумент reshape? – user2100039

+0

@ user2100039 Я изменил код, чтобы объяснить значение magic '2' ... это количество столбцов. Я добавлю примечание о '[]' part. – beaker

+0

Хорошее решение, чтобы избежать 'перестановки'! – Divakar

0

Основываясь на ваших новых критериях, это то, что вы хотите. Мое решение не самое хороший смотрит (майя кто-то может думать о хорошем векторизованноге подхода), но она работает

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 

использованием

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;] 
+0

Извините, пытаясь упростить проблему, я слишком упростил ее. Позвольте мне задать вопрос с более точными данными в этом примере. – user2100039

+0

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;]. – user2100039

+2

@ user2100039 Я думаю, что если вы не объясните критерии слияния словами, вы оставите слишком много догадок со стороны ответчиков. – Divakar

3

Approach # 1

Это может быть один подход нг я получил требования права проблемы -

%// 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 пробег -

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 

Подход № 2

Только за любовь bsxfun, вот один подход с его и ones (нет reshape или 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,:) 
+0

это векторный подход, о котором я не мог думать +1 – andrew