WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Matrix neu aufteilen

 

jabaa
Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 31.01.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.03.2012, 16:32     Titel: Matrix neu aufteilen
  Antworten mit Zitat      
Hallo,
ich würde gerne eine Matrix neu aufteilen, z.B. mit reshape.

Ich habe eine Matrix
Code:

a = [11 12 13 14;21 22 23 24;31 32 33 34;41 42 43 44];
 

und möchte diese nun zum Beispiel vierteln in der Form
Code:

a(:,:,1) = [11 12;21 22];
a(:,:,2) = [13 14;23 24];
a(:,:,3) = [31 32;41 42];
a(:,:,4) = [33 34;43 44];
 

damit ich danach den Durchschnitt über die Viertel berechnen kann
Code:

a_d = 1/4*(a(:,:,1)+a(:,:,2)+a(:,:,3)+a(:,:,4));
 


Die letzte Summation würde ich gerne per sum() berechnen. Mit reshape bekomme ich jedoch so eine Zerlegung nicht hin.
Kann mir da jemand einen Tip geben? Es handelt sich bei dem Beispiel um eine starke Vereinfachung. Die Anwendung arbeitet mit Bildern und somit mit Matrizen der Größe 512*512 oder größer. Die Größen der Matrix und der gewünschten Blöcke varieren

Mein Ziel ist etwas der Form
Code:

a = reshape(a,blockgroesse1,blockgroesse2,[]);
a_d = 1/4*sum(a);
 


Gruß
Jabaa
Private Nachricht senden Benutzer-Profile anzeigen


Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 28.03.2012, 17:10     Titel:
  Antworten mit Zitat      
sowas?
Code:
a = [11 12 13 14;21 22 23 24;31 32 33 34;41 42 43 44];
m=1;
for k=1:2
    for l=1:2
    b(:,:,m)=a(2*k-1:2*k,2*l-1:2*l)    ;
    m=m+1;
    end
end
a_d=1/4*sum(b,3);
Private Nachricht senden Benutzer-Profile anzeigen
 
Sirius3
Forum-Guru

Forum-Guru


Beiträge: 441
Anmeldedatum: 11.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.03.2012, 18:29     Titel:
  Antworten mit Zitat      
Hallo jabaa,

reshape kann die Reihenfolge der Zahlen (von oben nach unten, von links nach rechts) nicht ändern.
Du kannst mit
Code:
b=mat2cell(a,[2,2],[2,2]);

Deine Matrix in die gewünschten Untermatrizen aufteilen und mit
Code:
a=reshape([b{:}],2,2,[])

wieder zu einer 3d-Matrix zusammensetzen.

Grüße
Sirius.
Private Nachricht senden Benutzer-Profile anzeigen
 
jabaa
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 31.01.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.03.2012, 20:51     Titel:
  Antworten mit Zitat      
@winkow
ja, sowas, nur wenn ich da mit for-Schleifen anfange, läuft das Programm ewig oder Matlab friert ein. Deswegen suche ich ja einen eleganten Weg. Schleifen und Matlab vertragen sich halt überhaupt nicht.

@Sirius3
Das sieht gut aus. Das könnte mich ans Ziel bringen. Ich werde es morgen probieren
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 28.03.2012, 22:44     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
nur wenn ich da mit for-Schleifen anfange, läuft das Programm ewig oder Matlab friert ein. Deswegen suche ich ja einen eleganten Weg.

Dann wäre es gut gewesen, diese Information von Anfang an zu haben Wink

Zitat:
Schleifen und Matlab vertragen sich halt überhaupt nicht.

Das würde ich so nicht sagen. Schleifen sind tendentiell langsamer, dafür aber teilweise weniger speicherintensiv.

Wie groß ist die Matrix denn insgesamt? Gerade bei 64bit-Systemen kann das Betriebssystem zu swappen anfangen, wenn die Matrix sehr groß ist, und dann wirkt der Rechner ziemlich tot.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 30.03.2012, 00:45     Titel: Re: Matrix neu aufteilen
  Antworten mit Zitat      
Hallo jabaa,

Solche Aufgaben lassen sich immer mit RESHAPE und PERMUTE lösen:

Code:
a = [11 12 13 14;21 22 23 24;31 32 33 34;41 42 43 44];
reshape(permute(reshape(a, 2, 2, 4), [1,3,2]), 2,2,4)


Das Gerücht, dass Matlab und Schleifen sich nicht vertragen, ist seit der JIT-Acceleraration veraltet - und die gibt es seit Matlab 6.5 (2002). Siehe http://www.gomatlab.de/faq-performa.....ektorisierung-t19996.html

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
jabaa
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 31.01.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.03.2012, 09:42     Titel:
  Antworten mit Zitat      
Ok, ich habe eine alte Applikation, die durch die Schleifen stark ausgebremst wurde. Nun scheint sie aber deutlich Schneller zu laufen. Dann muss ich wohl meine Einstellung zu Schleifen ändern Smile

Und danke für eure hilfreichen Tipps.
Ich nutze jetzt
Code:

reshape(permute(reshape(a, blockgroesse1, blockgroesse2, []), [1,3,2]), blockgroesse1,blockgroesse2,[]);
sum(a,3);
 


Das tut genau, was ich will
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.