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

Matrixelemente (Nullen) verschieben bzw. vertauschen

 

Dr.Dreh

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.04.2014, 13:14     Titel: Matrixelemente (Nullen) verschieben bzw. vertauschen
  Antworten mit Zitat      
Hallo,

ich habe ein Problem an dem ich jetzt eine ganze Weile hänge und dachte mir, ich frag hier mal um Rat. Und zwar möchte ich Nullen in einer Matrix durch das darauffolgende Element ersetzen bzw. die Nullen ans Ende verschieben. Was meine ich damit:

Beispiel: Ich habe in eine Matrix A:

Code:

A = ones(4);
A(3,2) = 0;
A(2:3,3) = 0;
A(2:3,4) = 0;

A =

     1     1     1     1
     1     1     0     0
     1     0     0     0
     1     1     1     1
 


Was kann ich nun tun, um die Nullen ans Ende zu verschieben bzw. die Einsen "nach oben" zu verschieben um dieses Ergebnis zu bekommen:

Code:

A =

     1     1     1     1
     1     1     1     1
     1     1     0     0
     1     0     0     0
 


Zu berücksichtigen sei zudem noch, dass ich in meiner "realen" Matrix anstatt der Einsen verschiedene "Zahlen" vorliegen habe, wodurch eine einfache Sortierung nicht möglich ist (z.B. der Größe nach), denn dadurch würde sich ja die feste Reihenfolge der Zahlen ändern.
Es müsste daher sicherlich über den Index (logical der Matrix liegt vor) gegangen werden...

Vielen dank schonmal für eure Vorschläge und Ideen! Smile

Gruß Daniel


Harald
Forum-Meister

Forum-Meister


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

Zitat:
Zu berücksichtigen sei zudem noch, dass ich in meiner "realen" Matrix anstatt der Einsen verschiedene "Zahlen" vorliegen habe, wodurch eine einfache Sortierung nicht möglich ist (z.B. der Größe nach), denn dadurch würde sich ja die feste Reihenfolge der Zahlen ändern.

Dann bitte ein Beispiel mit verschiedenen Zahlen. Aus diesem Beispiel geht für mich jedenfalls nicht hervor, wie der Ablauf erfolgen soll und insbesondere inwiefern es nicht auf ein Sortieren hinausläuft.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Dr.Dreh

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.04.2014, 13:25     Titel:
  Antworten mit Zitat      
Meine reale Matrix sieht wie folgt aus:

Code:

Reflexindizes =

  Columns 1 through 12

   110   110   110   110   110   110   110   110   110   110   110   110
   200   200   200   200   200   200   200   200   200   200   200   200
   211   211   211   211   211   211   211   211   211   211   211   211
   220   220   220   220   220   220   220   220   220   220   220   220
   310   310   310   310   310   310   310   310   310   310   310   310
   222   222   222   222   222   222   222   222   222   222   222   222
   321   321   321   321   321   321   321   321   321   321   321   321

  Columns 13 through 24

   110   110   110   110   110   110   110   110   110   110   110   110
   200   200   200   200   200   200   200   200   200   200   200   200
   211   211   211   211   211   211   211   211   211   211   211   211
   220   220   220   220   220   220   220   220   220   220   220   220
   310   310   310   310   310   310   310   310   310   310   310   310
   222   222   222     0     0     0     0     0     0     0     0     0
   321   321   321   321   321   321   321   321   321   321     0     0

  Columns 25 through 32

   110   110   110   110   110   110   110   110
   200   200   200   200   200   200   200   200
   211   211   211   211   211   211   211   211
   220   220     0     0     0     0     0     0
   310   310     0     0     0     0     0     0
     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0
 


Die Einträge sollen später in Strings umgewandelt werden und in einem plot als Datenpunktbezeichung dienen. Zu diesen Einträgen existieren X (Energie) und Y (Intensität) Werte, wodurch die Reihenfolge der Elemente der Matrix "Reflexindizes "vorgegeben ist (diese kann ich ja einfach der Größe nach sortieren).

In diesem speziellen Fall möchte ich nun die Einträge "321" in den Spalten 16 - 22 um eins nach vorne Rücken. Ich hoffe das ist verständlich.

Gruß
Daniel
 
Harald
Forum-Meister

Forum-Meister


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

in diesem Beispiel:
Code:
M(M==0) = inf;
M = sort(M);
M(isinf(M)) = 0;


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Dr.Dreh

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.04.2014, 13:49     Titel:
  Antworten mit Zitat      
Super, das funktioniert prima. Vielen Dank!

Allerdings würde dieses Vorgehen für den die folgende Matrix:

Code:

Reflexindizes =

   011   011   011   011   011
   002   002   002   002   002
   110   110   110   110   110
   111   111   0       0      0  
   120   120   120   0       0  
   112   0      0       112   0  
   022   022   022   022   022
 
 


nicht mehr funktionieren. Eine Sortierung ist hier ja nicht ohne weiteres möglich, da sonst die vorgegebene Reihenfolge nicht mehr eingehalten werden würde. Hast du da auch noch eine Idee?

Gruß,
Daniel
 
Harald
Forum-Meister

Forum-Meister


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

was soll denn in diesem Fall das Ergebnis sein?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Dr.Dreh

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.04.2014, 14:25     Titel:
  Antworten mit Zitat      
Das sollte rauskommen:

Code:

Reflexindizes =

   011   011   011   011   011
   002   002   002   002   002
   110   110   110   110   110
   111   111   120   112   022  
   120   120   022   022   0  
   112   022   0     0        0  
   022   0      0     0        0
 


Die Einträge die "hinter" einer Null stehen sollen aufrücken und die Nullen ans Ende rücken. Bei Anwendung von
Code:
würde, wenn ich mich nicht täusche, die feste Reihenfolge ja verloren gehen.

Gruß
Daniel
 
Harald
Forum-Meister

Forum-Meister


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

mittlerweile glaube ich verstanden zu haben, was du vertauschen willst und welche Reihenfolge du andererseits fest lassen möchtest.

Code:
N = zeros(size(M));
for J = 1:size(M,2)
    nonzeros = M(:,J)~=0;
    N(1:nnz(nonzeros), J) = M(nonzeros,J);
end


Was sollen eigentlich die führenden Nullen?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Dr.Dreh

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.04.2014, 14:46     Titel:
  Antworten mit Zitat      
Harald, vielen Dank! Ich glaube genau das hab ich benötigt. Ich werde es mal für verschiedene Fälle durchprobieren.

Die Nullen ergeben sich aus dem Index einer anderen Matrix, die Peakpositionen in einem Spektrum beschreiben. Diese Peakpositionen können von Spektrum zu Spektrum verschieden sein, sprich mal fehlt ein Peak, mal ein anderer. (alle Spektren werden in meinem Programm jedoch simultan betrachtet) Und dementsprechend müssen eben auch die Peakbezeichnungen (Reflexindizes) angepasst werden. Ist etwas kompliziert zu erklären. Smile

Gruß
Daniel
 
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.