2016-08-04 7 views
0

j'ai un réseau de cellules de 3x1 qui ressemble à ceci:matrice 3d divisé en plusieurs matrices 2d

x={rand(256,901,160);rand(256,901,160);rand(256,901,160)}; 

    [256x901x160 double] 
    [256x901x160 double] 
    [256x901x160 double] 

Je voudrais prendre la 3ème dimension et le diviser en 160 différentes matrices 2d, donc 160 [256x901 ] matrices. Je veux le faire parce que j'ai écrit différentes fonctions qui prennent en matrices 2d. Ma sortie désirée serait une matrice de cellules 3x160 contenant des matrices de 256 x 901.

Je sais que j'ai besoin d'utiliser reshape ou mat2cell mais je ne suis pas trop sûr de la syntaxe.

EDIT

Je trouve un rythme plus lent moyen de le faire, mais ses grands pas ..

for i = 1:length(x) 
    for k = 1:160 
     y{:,k}= x{i}(:,:,k); 
    end 
end 

des suggestions pour améliorer la vitesse?

Répondre

1

Voici un exemple avec des réseaux plus petits, cela fonctionne sur votre exemple aussi:

x = {rand(3,4,5);rand(3,4,5);rand(3,4,5)}; 
y = cell(length(x),size(x{1},3)); 
for k = 1:length(x) 
    t = reshape(x{k},[size(x{1},1) size(x{1},2)*size(x{1},3)]); 
    y(k,:) = mat2cell(t,size(x{1},1),ones(size(x{1},3),1)*size(x{1},2)); 
end 

sur mon ordinateur, il prend 0,36035 secondes avec votre réseau de cellules.

0

Comment ça?

x ={rand(256,901,160), rand(256,901,160), rand(256,901,160)}'; 

x_1 = x{1}; 
x_2 = x{2}; 
x_3 = x{3}; 

two_d_arrays = cell(3, 160); 

for k = 1:size(two_d_arrays, 2) 
    two_d_arrays{1, k} = x_1(:, :, k); 
    two_d_arrays{2, k} = x_2(:, :, k); 
    two_d_arrays{3, k} = x_3(:, :, k); 
end  
1

J'ai essayé différentes approches mais j'ai trouvé que votre propre implémentation est la plus rapide, même comparée aux autres solutions données. Si vous voulez plus de vitesse, vous pouvez envisager une boucle parfor. (calcul parallèle)