Matlab: Matrizen splitten

Neue Frage »

Math1986 Auf diesen Beitrag antworten »
Matlab: Matrizen splitten
Hallo,
Problem ist:
Ich habe eine Matrix, bspw (Größe 8x2)
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
A =

     664/815        338/353   
    1298/1433       687/712   
     751/5914       589/3737  
     717/785       6271/6461  
    1493/2361       581/607   
     694/7115       614/1265  
     408/1465      1142/1427  
    1324/2421       689/4856  


Nun möchte ich diese in vier fortlaufende Matrizen der Größe 2x2 aufteilen, so dass die erste Matrix dann die Submatrix von Zeile 1 bis 2 wäre
code:
1:
2:
     664/815        338/353   
    1298/1433       687/712   

Die zweite ware dann Zeile 3 bis 4:
code:
1:
2:
     751/5914       589/3737  
     717/785       6271/6461 

Und so weiter. Das ganze soll dann in einem Array gespeichert werden.

Irgendwelche Ideen?
Airblader Auf diesen Beitrag antworten »

Und das soll dynamisch in der Größe der Ausgangsmatrix sein? Ich weiß zwar nicht, ob es nicht noch einen supercoolen Matlab-Oneliner gibt, aber solange die Matrizen nicht rießig sind, macht die Performance hier nichts aus:

code:
1:
2:
3:
4:
5:
someArray = [];

for ii = 2:2:size(A, 1)
    someArray(ii/2) = A(ii-1:ii, :);
end


Ist ungetestet, da ich seit anderthalb Jahren keine Matlablizenz mehr habe.
Math1986 Auf diesen Beitrag antworten »

Danke.

Ja, die Größe der Ausgangsmatrix ist dynamisch, und auch die Größe der Blöcke (hätte ich dazusagen sollen,ich weiß aber, dass es aufgeht).

Eine ganz ähnliche Lösung wie du habe ich nun auch, habe aber noch keinen Einzeiler dazu gefunden. smile
Wenn also jemand eine Idee für einen Einzeler hat dann her damit smile
Airblader Auf diesen Beitrag antworten »

Wenn klar ist, dass es aufgeht, geht es dynamisch in der Anzahl der Blöcke mit

code:
1:
2:
3:
4:
5:
6:
7:
8:
blockSize = 3; # number of rows per matrix

someArray = [];

for ii = blockSize:blockSize:size(A, 1)
    someArray(ii/blockSIze) = A(ii-blockSize+1:ii, :);
end


Wenn man das einfach als Funktion extrahiert, wird es danach zum Einzeiler.

Eine kurze Recherche zeigt aber, dass du dir mal mat2cell anschauen solltest, das könnte genau das sein, was du suchst (ich kanns wie gesagt nicht ausprobieren). Gefühlt sollte es so gehen:

code:
1:
2:
blockSize = 3;
C = mat2cell(A, blockSize * ones(1, size(A, 1) / blockSize));


Edit: Ich habe es mit einem Online-Compiler probiert, scheint zu funktionieren.
Math1986 Auf diesen Beitrag antworten »

Danke, werde ich mir mal anschauen, scheint aber genau das Richtige zu sein. Freude
Neue Frage »
Antworten »



Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »