2016-08-15 4 views
1

Так что скажем, что у меня есть 3d-матрица A переменного размера. Есть ли простая в использовании команда, которая складывает матрицу как B = [squeeze(A(1,:,:)); squeeze(A(2,:,:)); ...; squeeze(A(n,:,:))]?Стек подматрицы 3d-матрицы в одной матрице

Сейчас я использую следующие, но его громоздким:

if(length(A(:,1,1))==1) 
    B =squeeze(A); 
else 
    B = zeros(length(A(:,1,1)*length(A(1,:,1)), length(A(1,1,:))); 
    B(1:length(A(1,:,1)),:) = squeeze(A(1,:,:)); 

    for i=2:length(A(1,:,1) 
     B(1:i*length(A(1,:,1)),:)=... 
      vertcat(B, squeeze(A(i,:,:))); 
    end 
end 

ответ

4

Это будет делать то же самое, как B = [squeeze(A(1,:,:)); squeeze(A(2,:,:)); ...; squeeze(n,:,:))]. Не уверен, что это быстрее, чем цикл:

B = num2cell(A, [2 3]); % split along first dimension into cells 
B = permute([B{:}], [2 3 1]); % concatenate the cells along second dimension 
    % and remove first dimension, which is a singleton 
4

Вы можете использовать reshape с permutation размерами Матрицы и транспонированным:

C = reshape(permute(A,[3,2,1]),size(A,3),[]).'; 

Что будет корректно адаптироваться к произвольному количеству строк. Небольшой тест:

A = rand([3,4,4]); 
B = [squeeze(A(1,:,:)); squeeze(A(2,:,:)); squeeze(A(3,:,:))]; 
C = reshape(permute(A,[3,2,1]),size(A,3),[]).'; 
all(B(:)==C(:)) % should be true/1 
3

Вот еще один с помощью permute и reshape -

B = reshape(permute(A,[2,1,3]),[],size(A,3)) 
+1

Дерьмо, я знал, что транспонирование не было необходимости. Отлично сработано. – TroyHaskin

+0

@TroyHaskin Да! По крайней мере, вы могли бы использовать '[]' для замены этого размера (A, 1) * (A, 2) ', чтобы он выглядел менее громоздким в вашем решении, поскольку OP намекал на него! – Divakar

+0

Да. Это всего лишь ментальный блок, который у меня есть, поскольку я использую единое соглашение по сравнению с версией с несколькими входами. Думаю, я сделаю это изменение сейчас. – TroyHaskin