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 sortieren/Nullen nach hinten schieben

 

Joa
Forum-Century

Forum-Century


Beiträge: 133
Anmeldedatum: 19.05.09
Wohnort: ---
Version: R2013b
     Beitrag Verfasst am: 04.08.2009, 11:03     Titel: Matrix neu sortieren/Nullen nach hinten schieben
  Antworten mit Zitat      
Hallo,
ich habe folgendes Problem.
Ich habe eine Matrix in der ich bestimmte Werte zu Null gesetzt hab. Jetzt möchte ich die Werte in den jeweiligen Zeilen die nicht Null sind, nach vorne schieben und die Nullen nach hinten. Dabei sollen aber die Werte die in der gleichen Zeile stehen auch in dieser zeile und zusammen stehen bleiben.
hat jemand eine Idee für die Lösung dieses Problems?

Vielen Dank schonmal
LG Joa
Private Nachricht senden Benutzer-Profile anzeigen


derOli
Forum-Meister

Forum-Meister


Beiträge: 579
Anmeldedatum: 19.03.08
Wohnort: Leipzig
Version: 2010a
     Beitrag Verfasst am: 04.08.2009, 11:55     Titel:
  Antworten mit Zitat      
Hi,

wahrscheinlich löst der Befehl sort dein Problem, aber ich verstehe nicht so richtig was du machen willst. Nach was soll sortiert werden also nach einer Spalte oder einer Zeile? Soll die Zeile mit den meisten Zahlen ungleich null oben stehen?

Erklär das bitte mal etwas genauer am besten mit Minimalbeispiel.

Viele Grüße,

der Oli
Private Nachricht senden Benutzer-Profile anzeigen
 
Joa
Themenstarter

Forum-Century

Forum-Century


Beiträge: 133
Anmeldedatum: 19.05.09
Wohnort: ---
Version: R2013b
     Beitrag Verfasst am: 04.08.2009, 12:05     Titel:
  Antworten mit Zitat      
Also, ich habe eine Matrix.
Die sieht ungefähr so aus:
Code:

     0     2     8     0     0     0
     0     0    20    24     0     0
    17     9     0     0     8    16
    21     3     0    20     0     0
     0     9     0     0     0     0
    23     3     0     7    22     0
    18     0     0     0     9    17

Und ich möchte jetzt das die Zahlen die ungleich Null sind nach vorne rutschen, so dass die Matrix dann so aussieht:
Code:

     2     8     0     0     0     0
    20    24     0     0     0     0
    17     9     8    16     0     0
    21     3    20     0     0     0
     9     0     0     0     0     0
    23     3     7    22     0     0
    18     9    17     0     0     0

Ich habe das jetzt mit einem selbst gebastelten Sortieralgorithmus gemacht, aber vielleicht geht das ja auch noch einfacher?

LG Joa
Private Nachricht senden Benutzer-Profile anzeigen
 
derOli
Forum-Meister

Forum-Meister


Beiträge: 579
Anmeldedatum: 19.03.08
Wohnort: Leipzig
Version: 2010a
     Beitrag Verfasst am: 18.08.2009, 12:06     Titel:
  Antworten mit Zitat      
Also ich habs jetzt so einigermassen hingekriegt. Ist garnicht so ne einfache Sache wie ich erst dachte. (Vielleicht auch zu kompliziert gedacht.)
Aber ganz ohne Schleife komme ich auch nicht aus. Vielleicht hat ja jemand eine Idee wie man aus einem Vektor mit z.B. [2 3 4 2] die Werte immer von 1 bis zu dem Wert in den Vektor kriegt also sollte bei obigen Beispiel rauskommen: [1 2 1 2 3 1 2 3 4 1 2]. Das hab ich jetzt bloß mit ner Schleife hinbekommen.

Code:


A=   [  0     2     8     0     0     0
     0     0    20    24     0     0
    17     9     0     0     8    16
    21     3     0    20     0     0
     0     9     0     0     0     0
    23     3     0     7    22     0
    18     0     0     0     9    17];
wish=[ 2     8     0     0     0     0
    20    24     0     0     0     0
    17     9     8    16     0     0
    21     3    20     0     0     0
     9     0     0     0     0     0
    23     3     7    22     0     0
    18     9    17     0     0     0];
B=A';

[a,b]=find(B~=0)
[c,d]=unique(b)
e=[d(1);diff(d)]

f=[]
for k=1:size(e)
    f=[f 1:e(k)]
end
C=zeros(size(A));
C(sub2ind(size(A), b, f'))=A(sub2ind(size(A), b, a));
C
 


Viele Grüße,

der Oli
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 18.08.2009, 13:43     Titel:
  Antworten mit Zitat      
Hallo,

so könnte es auch gehen
Code:

A=   [  0     2     8     0     0     0
     0     0    20    24     0     0
    17     9     0     0     8    16
    21     3     0    20     0     0
     0     9     0     0     0     0
    23     3     0     7    22     0
    18     0     0     0     9    17];
 
B  = A';
A(~A) = NaN;

[A] = sort(A');
A (isnan(A)) = 0;

A(A~=0) =B(B~=0);
A=A'

 
Private Nachricht senden Benutzer-Profile anzeigen
 
outsider
Forum-Meister

Forum-Meister


Beiträge: 806
Anmeldedatum: 03.09.07
Wohnort: München
Version: R2012b
     Beitrag Verfasst am: 18.08.2009, 13:49     Titel:
  Antworten mit Zitat      
Code:
>> a =[ 0     2     8     0     0     0
     0     0    20    24     0     0
    17     9     0     0     8    16
    21     3     0    20     0     0
     0     9     0     0     0     0
    23     3     0     7    22     0
    18     0     0     0     9    17];

a = a';
tmp = sort(sign(a),'descend');
tmp(logical(tmp)) = a(a~=0);
a = tmp'

a =

     2     8     0     0     0     0
    20    24     0     0     0     0
    17     9     8    16     0     0
    21     3    20     0     0     0
     9     0     0     0     0     0
    23     3     7    22     0     0
    18     9    17     0     0     0

>>


MfG
Private Nachricht senden Benutzer-Profile anzeigen
 
outsider
Forum-Meister

Forum-Meister


Beiträge: 806
Anmeldedatum: 03.09.07
Wohnort: München
Version: R2012b
     Beitrag Verfasst am: 18.08.2009, 13:50     Titel:
  Antworten mit Zitat      
@denny
Hey - Du warst schneller - wir haben eigentlich die gleiche Lösung! Smile


MfG
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 18.08.2009, 13:57     Titel:
  Antworten mit Zitat      
@outsider

stimmt sieht ähnlich aus, aber deine ist wie immer viel kürzer Very Happy Cool
Private Nachricht senden Benutzer-Profile anzeigen
 
Titus
Forum-Meister

Forum-Meister


Beiträge: 871
Anmeldedatum: 19.07.07
Wohnort: Aachen
Version: ---
     Beitrag Verfasst am: 18.08.2009, 14:31     Titel:
  Antworten mit Zitat      
Hallo,

eine etwas einfacher gestrickte Variante:
Code:
B = zeros(size(A));
for i=1:size(A,1)
    nichtNull = A(i,:)~=0;
    B(i, 1:sum(nichtNull)) = A(i, nichtNull);
end
 


Wink

Titus
Private Nachricht senden Benutzer-Profile anzeigen
 
derOli
Forum-Meister

Forum-Meister


Beiträge: 579
Anmeldedatum: 19.03.08
Wohnort: Leipzig
Version: 2010a
     Beitrag Verfasst am: 18.08.2009, 14:39     Titel:
  Antworten mit Zitat      
Hallo,

schön, dass ihr beiden wieder aktiver seid, da kann ich auch mal wieder was dazulernen. Smile

Viele Grüße,

der Oli
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 - 2024 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.