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 unterteilen, splitten

 

OrbiTroN
Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 13.10.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.10.2011, 16:31     Titel: Matrix unterteilen, splitten
  Antworten mit Zitat      
Hallo MatLab Gemeinde,

ich sitze gerade vor folgendem Problem. Ich möchte eine Matrix nach folgendem Schema aufteilen um sie später untereinander zu vergleichen.
Code:

A = [1 2 3 4;5 6 7 8;9 10 11 12;13 14 15 16]

A1=[A(1,1:2);A(2,1:2)]
A2=[A(1,3:4);A(2,3:4)]
A3=[A(3,1:2);A(4,1:2)]
A4=[A(3,3:4);A(4,3:4)]
 


Gibt es eine "fertige Funktion" die mir das Aufteilen einer Matrix ermöglicht? Oder muss man über eine for Schleife jedes Element auslesen? Später habe ich eine größere Matrix 950x950, da macht sich bestimmt eine for Schleife schlecht wegen der zeitlichen Dauer oder?

Ich möchte die Matrix dann vierteln oder achteln, also immer in gleich große "Stücke".

Wie sollte man die gesplitteten Matrizen am besten deklarieren?

Ich bin für jede Hilfe dankbar.

Grüße und ein schönes Wochenende!
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: 29.10.2011, 23:39     Titel: Re: Matrix unterteilen, splitten
  Antworten mit Zitat      
Hallo OrbiTroN,

Eine Schleife ist die beste Methode. Es gibt zwar eine fertige Funktion, nämlich MAT2CELL:
Code:
A = [1 2 3 4;5 6 7 8;9 10 11 12;13 14 15 16];
C = mat2cell(A, [2, 2], [2, 2]);

Dies enthält aber auch einfache FOR-Schleifen.

Es ist wichtig, dass Du ein CELL-Array verwendest, statt die Variablen A1, A2, ... zu erzeugen.

Eine andere Idee wäre ein numerisches Array:
Code:
B = reshape(permute(reshape(A, 2, 2, 2, 2), [1,3,2,4]), 2, 2, 4);
disp(B(:, :, 1));
disp(B(:, :, 2));   % etc

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 13.10.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.10.2011, 13:15     Titel:
  Antworten mit Zitat      
Hallo Jan,
danke für deine Antwort... Das war genau die Funktion die ich gesucht habe. mat2cel funktioniert wunderbar. Jetzt würde ich aber noch gerne die mat2cel Funktion auf meinen folgenden Code anpassen.
Code:

teiler = 2 % gewünschter Teiler der Matrix 1 ... n

A=magic(950); % die folgende Schleife, da meine Matrix nicht ganz quadratisch ist
topo_size_min=min(size(A));
topo_teillaenge=topo_size_min/teiler;

   if topo_teillaenge == round(topo_teillaenge)
   % disp('teiler ergibt ganze Zahl');
   else
   % disp('teiler ergibt keine ganze Zahl');
     while topo_teillaenge ~= round(topo_teillaenge)
       topo_size_min=topo_size_min-1;
       topo_teillaenge=topo_size_min/teiler;
     end
   end

topo_equal=A(1:topo_size_min,1:topo_size_min); % quadratisch teilbare matrix
 

Das Problem ist nun, dass die Länge und Anzahl der "Teilmatrizen" von dem Teiler der "Orginalmatrix" abhängig ist.
Wie kann ich dieses Vorhaben realisieren? Ohne von Hand die Anzahl der teil Matrizen in mat3cel einzutragen?
Code:

C = mat2cell(topo_equal, [topo_teillaenge, topo_teillaenge], [topo_teillaenge, topo_teillaenge]);
 


Danke für die hilfe,

Grüße Orbitron
Private Nachricht senden Benutzer-Profile anzeigen
 
OrbiTroN
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 13.10.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.11.2011, 13:10     Titel:
  Antworten mit Zitat      
Hallo Matlab Gemeinde,

ich bin etwas ungeduldig und habe den code noch mal als funktionierendes Bsp. angefügt. Mein Problem sind die quadratisch wachsenden mat2cell Matritzen. Gibt es eine Möglichkeit, diesen Aufwand von einer Schleife erledigen zu lassen? Die subplots sind ab einer gewissen Anzahl an Teilungen eh nicht mehr sinnvoll darstellbar, aber die mat2cell Matritzen wären zur auswertung wichtig.

Problemstellung:
Code:

C = mat2cell(C_A, [C_len, ... , n], [C_len, ..., n]);
 


Bsp. Code:
Code:

teiler = 3; % der Teiler soll A quadratisch teilen, n=2,3,4,...
A = magic(950);
A_len=min(size(A));

C_len=A_len/teiler;
   

% suche die größte teilbare laenge der Teilmatrix
if C_len == round(C_len)
  disp('Laenge ergibt ganze Zahl');
else
  disp('Laenge ergibt keine ganze Zahl');
  while C_len ~= round(C_len)
    A_len=A_len-1;
    C_len=A_len/teiler;
  end
end

% erstelle die größte teilbare quadratische Matrix
C_A=A(1:A_len,1:A_len);

figure;
imagesc(C_A)
     

if teiler <=1
disp('Teiler ist zu klein, sinnlos');
end

if teiler ==2
C = mat2cell(C_A, [C_len, C_len], [C_len, C_len]);
figure;
subplot(221),imagesc(C{1,1})
subplot(222),imagesc(C{1,2})
subplot(223),imagesc(C{2,1})
subplot(224),imagesc(C{2,2})
end

if teiler ==3
C = mat2cell(C_A, [C_len, C_len, C_len], [C_len, C_len, C_len]);
figure;
subplot(331),imagesc(C{1,1})
subplot(332),imagesc(C{1,2})
subplot(333),imagesc(C{1,3})
subplot(334),imagesc(C{2,1})
subplot(335),imagesc(C{2,2})
subplot(336),imagesc(C{2,3})
subplot(337),imagesc(C{3,1})
subplot(338),imagesc(C{3,2})
subplot(339),imagesc(C{3,3})
end

if teiler ==4
C = mat2cell(C_A, [C_len, C_len, C_len, C_len], [C_len, C_len, C_len, C_len]);
figure;
subplot(4,4,1),imagesc(C{1,1})
subplot(4,4,2),imagesc(C{1,2})
subplot(4,4,3),imagesc(C{1,3})
subplot(4,4,4),imagesc(C{1,4})
subplot(4,4,5),imagesc(C{2,1})
subplot(4,4,6),imagesc(C{2,2})
subplot(4,4,7),imagesc(C{2,3})
subplot(4,4,8),imagesc(C{2,4})
subplot(4,4,9),imagesc(C{3,1})
subplot(4,4,10),imagesc(C{3,2})
subplot(4,4,11),imagesc(C{3,3})
subplot(4,4,12),imagesc(C{3,4})
subplot(4,4,13),imagesc(C{4,1})
subplot(4,4,14),imagesc(C{4,2})
subplot(4,4,15),imagesc(C{4,3})
subplot(4,4,16),imagesc(C{4,4})
end

if teiler >4
disp('Teiler zu groß, bitte programmiere eine Schleife');
end
 


Danke für eure Hilfe,

Grüße OrbiTroN
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 01.11.2011, 13:42     Titel:
  Antworten mit Zitat      
Hallo,

wenn ich das richtig verstehe, willst du "teiler" variabel halten.
Das ginge so:
Code:
C = mat2cell(C_A, repmat(C_len, 1, teiler), repmat(C_len, 1, teiler));


Auch die Bilder könnten in einer Schleife erzeugt werden, z.B.
Code:
C = C';
for I=1:teiler^2
subplot(teiler,teiler,I),imagesc(C{I})
end


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
OrbiTroN
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 13.10.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.11.2011, 14:16     Titel:
  Antworten mit Zitat      
Hallo Harald,
genau das habe ich gesucht.

Vielen Dank, wäre ich nie selber drauf gekommen!

Grüße!
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.