Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Bücher:

Einstieg in das Programmieren mit MATLAB

Fachkräfte:
weitere Angebote

Partner:


Vermarktungspartner


Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Null/NaN in Matrixspalte nach unten rutschen

 

Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.09.2020, 23:34     Titel: Null/NaN in Matrixspalte nach unten rutschen
  Antworten mit Zitat      
Hallo MATLAB-Begeisterte,

In einer Spalte meiner Matrix befinden sich an verschiedenen Stellen Nullen. Um diese im Linienplot nicht anzeigen zu lassen, habe ich diese zu NaN geändert. Jetzt ist aber die Linie im Plot nicht durchgängig.

Daher würde ich gerne die Nullen oder die NaNs in der Matrix nach untern verschieben, während die restlichen Werte in originaler Reihenfolge nach oben rutschen. Alle weiteren Spalten sollten davon nicht beeinflusst werden. Aus Gründen der Übersichtlichkeit möchte ich die Werte am Ende nicht in einem zusätzlichen Vektor gespeichert haben, sondern wieder in der Original-Matrix.

Beispielspalte (entweder 0 oder NaN):
Start matrixx(:,4) = 0 2 0 0 1
Ende matrixx(:,4) = 2 1 0 0 0

Eine neue Variable ohne NaN habe ich mit isnan definieren können.
Code:

indexx=~isnan(matrixx(:,4));
neuervektor=matrixx(indexx,4);

Ich würde allerdings gerne vermeiden danach die Spalte in der Matrix erst mit Nullen/NaN und dann mit der neuen Variable überschreiben zu müssen. Gibt es da vielleicht eine insgesamt elegantere Lösung?

Vielen Dank, Sascha


Harald
Forum-Meister

Forum-Meister


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

auf Anhieb fällt mir nichts besseres ein.

Wenn es nur um Eleganz geht und darum, dass man wohl um eine for-Schleife über die Spalten nicht herumkommt, würde ich eine kleine Funktion schreiben und den weniger eleganten Teil somit im Hauptcode "verstecken".

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.09.2020, 16:10     Titel:
  Antworten mit Zitat      
Hallo Harald,

vielen Dank für deine Antwort. Ist natürlich schade zu hören, aber dann werde ich wohl vorerst bei meiner Methode bleiben. Die Ausgliederung in eine Funktion würde zumindest die Übersichtlichkeit wahren und mit einer ordentlichen Kommentierung auch das Verständnis.

Für andere Ideen bin ich trotzdem weiterhin offen!

Viele Grüße, Sascha
 
Jan S
Moderator

Moderator


Beiträge: 10.972
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 07.09.2020, 16:37     Titel: Re: Null/NaN in Matrixspalte nach unten rutschen
  Antworten mit Zitat      
Hallo,

Eine vektorisierte Lösung:
Code:
X = randi([0,3], 10, 5);  % Test data
m = (X ~= 0);
Y = nan(size(X));
Y(sort(m, 1, 'descend')) = X(m)

Das würde ich auch in eine Unterfunktion auslagern. Wirklich effizient ist das Sortieren nicht. Ein Schleife ist 40% schneller:
Code:
function Y = ZerosToNaNBottom(X)
m = (X ~= 0);
Y = nan(size(X));

% Y(sort(m, 1, 'descend')) = X(m);

% Faster:
n = sum(m, 1);       % Number of non-zeros per column
for k = 1:size(X, 2)  % Loop over columns
   Y(1:n(k), k) = X(m(:, k), k);
end
end

Gruß Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.09.2020, 21:09     Titel:
  Antworten mit Zitat      
Hallo Jan.

Vielen Dank für deine beiden Vorschläge! Sortieren nach dem logical Datensatz ist auf jeden Fall ein netter Trick. Und auch die Matrix-Erstellung in der Schleife habe ich so noch nicht gesehen. Werde ich umsetzten.

Viele Grüße, Sascha
 
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
.


goMatlab ist ein Teil des goForen-Labels
goForen.de goMATLAB.de goLaTeX.de


 Impressum  | Nutzungsbedingungen  | Datenschutz  | Werbung/Mediadaten | Studentenversion | FAQ | goMatlab RSS Button RSS


Copyright © 2007 - 2020 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
Partner: LabVIEWforum.de

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.