2016-08-04 11 views
0

ich eine 3x1 Zellen-Array haben, die wie folgt aussieht:Split 3D-Matrix in mehrere 2D-Matrizen

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

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

Ich möchte die dritte Dimension nehmen und teilen sie in 160 verschiedenen 2D-Matrizen, so 160 [256x901 ] Matrizen. Ich möchte dies tun, weil ich verschiedene Funktionen geschrieben habe, die 2d-Matrizen aufnehmen.

meine gewünschte Ausgabe wäre ein 3x160-Zellen-Array mit Matrizen von 256x901.

Ich weiß, dass ich Umform oder Mat2cell verwenden muss, aber ich bin nicht sicher über die Syntax.

EDIT

Ich fand einen langsamen Weg, es zu tun, aber es ist nicht so toll ..

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

Vorschläge Geschwindigkeit zu verbessern?

Antwort

1

Hier ein Beispiel mit kleineren Arrays ist, funktioniert es auch auf Ihrem Beispiel:

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 

auf meinem Computer dauert es 0,36035 Sekunden mit Ihrem Zellenfeld.

0

Wie ist das?

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

Ich habe verschiedene Ansätze ausprobiert, aber ich habe festgestellt, dass Ihre eigene Implementierung die schnellste ist, sogar im Vergleich zu den anderen Lösungen. Wenn Sie mehr Geschwindigkeit wünschen, können Sie eine Parfor-Schleife in Betracht ziehen. (parallele Berechnung)