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

Zeilen einer Matrix sortieren/ordnen für diagonale Anordnun

 

gombolino
Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 04.10.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.10.2012, 20:19     Titel: Zeilen einer Matrix sortieren/ordnen für diagonale Anordnun
  Antworten mit Zitat      
Hallo zusammen,
folgendes Problem bereitet mir Kopfzerbrechen.
Ich moechte eine Matrix so orden, dass alle Einträge (beliebige Zahl) auf der Hauptdiagonalen (j,j) liegen.
Dazu sollen die Zeilen getauscht/bewegt werden.
In jeder Zeile gibt es entweder einen oder keinen Eintrag.
Im Beispiel sollte:
Zeile1 in Zeile2
Zeile2 in Zeile3
Zeile3 in Zeile4
Zeile4 in Zeile1
verschoben werden.

C_Ausgang =
0 50 0 0 0 0 0
0 0 40 0 0 0 0
0 0 0 30 0 0 0
0 0 0 0 0 0 0
0 0 0 0 20 0 0
0 0 0 0 0 10 0
0 0 0 0 0 0 5

C_Ziel =
0 0 0 0 0 0 0
0 50 0 0 0 0 0
0 0 40 0 0 0 0
0 0 0 30 0 0 0
0 0 0 0 20 0 0
0 0 0 0 0 10 0
0 0 0 0 0 0 5

Folgendes habe ich schon versucht. Der Code klappt immer dann nicht, wenn eine Zeile nach "oben" getauscht wird und diese Zeile noch nicht am richtigen Platz ist.
Wenn ich die Schleife mehrmals wiederhole, kommt irgendwann das richtige Ergebnis.
Über Anregungen zur Verbesserung, gerne auch mit neuem Ansatz, wäre ich sehr dankbar!
Hoffe mir kann jemand helfen =)
Grüße

Code:

for i=1:n  %Schleife über Knotenanzahl (n=7 im Bsp)
    j=find(C_Ausgang(i,:)~=0);    % "an welcher Spaltennummer/Knoten ist ein Eintrag ungleich Null"
    if j~=i   %entspricht dem Fall, dass Eintrag nicht auf Diagonale liegt.
        C_Ausgang([i,j],:) = C_Ausgang([j,i],:);
        P([i,j],:) = P([j,i],:);
    end
end
 
Private Nachricht senden Benutzer-Profile anzeigen


dmjr
Forum-Century

Forum-Century


Beiträge: 199
Anmeldedatum: 02.10.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.10.2012, 01:12     Titel:
  Antworten mit Zitat      
Code:

for i=1:n  %Schleife über Knotenanzahl (n=7 im Bsp)
    j=find(C_Ausgang(:,i)~=0);    % "an welcher Zeile ist ein Eintrag ungleich Null, dieser gehört in die i-te zeile
    if j~=i   %entspricht dem Fall, dass Eintrag nicht auf Diagonale liegt.
        C_Ausgang([i,j],:) = C_Ausgang([j,i],:);
        P([i,j],:) = P([j,i],:);
    end
end


Die Änderungen verbergen sich im Aufruf von "find" Wink
Private Nachricht senden Benutzer-Profile anzeigen
 
gombolino
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 04.10.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.10.2012, 13:14     Titel:
  Antworten mit Zitat      
Vielen Dank!
Eine sehr geschickte Lösung des Problems. Mit deiner Methode werden wirklich alle Einträge mindestens 1 mal kontrolliert!
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: 11.10.2012, 16:36     Titel: Re: Zeilen einer Matrix sortieren/ordnen für diagonale Anor
  Antworten mit Zitat      
Hallo gombolino,

Code:
% UNGETESTET!
C = [0 50 0 0 0 0 0; ...
   0 0 40 0 0 0 0; ...
   0 0 0 30 0 0 0; ...
   0 0 0 0 0 0 0; ...
   0 0 0 0 20 0 0; ...
   0 0 0 0 0 10 0; ...
   0 0 0 0 0 0 5];

D = bsxfun(@times, (C ~= 0), 1:size(C, 2));
index = max(D, 2);
Result = zeros(size(C));
Result(index, :) = C(index ~= 0, :)

Hübsch ist das nicht. Aber schnell.


Gruß, Jan
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.