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: Vergleiche Zeilen mit gleichem z-Wert und gib Max

 

Nekrokeks
Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 12.12.13
Wohnort: ---
Version: R2012b
     Beitrag Verfasst am: 23.06.2015, 10:58     Titel: Matrix: Vergleiche Zeilen mit gleichem z-Wert und gib Max
  Antworten mit Zitat      
Hallo liebes Forum,

ich schreibe mir im Moment ein Skript zur Datenauswertung zusammen.

In den ersten Zeilen lösche ich alle Nullzeilen aus der Ax2-Matrix (A ist bei mir im Millionen-Bereich) und Runde alle Werte der z-Koordinate auf 2 Dezimalstellen. Also meine Matrix sieht so aus:
Simulationsergebnis |||| zugehörige Z-Koordinate
. |||| .
. |||| .
usw.

Ok das trägt hoffentlich zum Verständnis bei, jetzt mein Problem:

Ich möchte alle gleichen Z-Koord. im Simulationsergebnis miteinander vergleichen und möchte nur die Zeile mit dem Maximalen Simulationsergebnis behalten. Alle anderen sollen gelöscht werde.

Ich habe es so versucht: (TrueData ist meine Matrix)

Code:
for i = 1:length(TrueData)
        index = find(TrueData(:,2) == TrueData(i,2);
        for j = 1:length(index)
        if TrueData(i,1) < TrueData(index(j,1),1)
            TrueData(i,1) = [];
        end
        end
end


Leider klappt es so nicht. Ich vermute, dass die letzte Zeile
Code:
TrueData(i,1) = []

nicht in Ordnung ist, aber ich weiß nicht wieso. ich habe das in meinem Code schonmal erfolgreich zum Löschen der Nullzeilen verwendet:
Code:
for i = 1:length(TrueData)
    TrueData(any(TrueData==0,2),:) = [];  %Alle Nullzeilen entfernt%
end


Wo ist mein denkfehler?

Vielleicht hat auch jemand einen Vorschlag, wie ich es eleganter lösen kann... Denke diese Schleifen werden mein Programm bei 1 Million durchläufen schon sehr langsam werden lassen Sad

Viele Grüße

Nekro
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: 23.06.2015, 12:33     Titel: Re: Matrix: Vergleiche Zeilen mit gleichem z-Wert und gib Ma
  Antworten mit Zitat      
Hallo Nekrokeks,

Zitat:
Also meine Matrix sieht so aus:
Simulationsergebnis |||| zugehörige Z-Koordinate
. |||| .
. |||| .
usw.

Ich verstehe nicht, wie diese Grafik eine Ax2-Matrix wiedergibt. Was bedeuten die Punkte und die Bars?
Poste lieber ein kleines Beispiel in valider Matlab-Syntax.

Zitat:
Ich möchte alle gleichen Z-Koord. im Simulationsergebnis miteinander vergleichen und möchte nur die Zeile mit dem Maximalen Simulationsergebnis behalten. Alle anderen sollen gelöscht werde.

Ich habe gestern eine fast identische Frage in einem anderen Matlab-Forum gelesen. Verblüffend.

Der gepostete Code läuft nicht, weil Klammern falsch gesetzt sind:
Code:
index = find(TrueData(:,2) == TrueData(i,2);
% Hier fehlt eine schließende Klammer

 if TrueData(i,1) < TrueData(index(j,1),1)
% Hier fehlt eine öffnende Klammer
 

Du lässt eine Schleife über die Anzahl der Zeilen der Input-Matrix laufen. Zwischendurch verkleinerst Du allerdings diese Matrix. Das muss scheitern.

Zitat:
Code:
for i = 1:length(TrueData)
    TrueData(any(TrueData==0,2),:) = [];  %Alle Nullzeilen entfernt%
end

Das ist merkwürdig! Wozu benutzt Du hier eine Schleife? Der Inhalt hängt ja gar nicht von i ab, also kannst Du das FOR auch einfach weglassen.

Zitat:
Vielleicht hat auch jemand einen Vorschlag, wie ich es eleganter lösen kann... Denke diese Schleifen werden mein Programm bei 1 Million durchläufen schon sehr langsam werden lassen :(

Wieso denkst Du das? Eine Schleife mit 1e6 Iterationen benötigt zwar messbar viel Zeit, aber dass man nun vor dem Rechner sitzt und wartet ist doch eher unwahrscheinlich bei so wenigen Zahlen.
Aber die Matrix immer wieder zu verkleinern ist eine sehr starke Bremse. Denn mit jedem Löschen muss Matlab eine komplette neue Matrix im Speicher reservieren und die alten Daten kopieren. Datei können im schlimmsten Fall 1e6*1e6*8/2 Speicher-Zugriffe nötig sein und das bringt einen Rechner schon zum Schwitzen.

Vorschlag:
Code:
TrueData(any(TrueData == 0, 2), :) = [];
[T, Order] = sortrows(TrueData);
Index = [diff(T(:,2)) ~= 0, true];
Result = T(Index, :);

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 12.12.13
Wohnort: ---
Version: R2012b
     Beitrag Verfasst am: 24.06.2015, 10:33     Titel:
  Antworten mit Zitat      
Hallo Jan,

danke für deine Antwort.

Zitat:
Ich verstehe nicht, wie diese Grafik eine Ax2-Matrix wiedergibt. Was bedeuten die Punkte und die Bars?
Poste lieber ein kleines Beispiel in valider Matlab-Syntax.


Ja ok das war nur verwirrend. In meinem Testbeispiel ist meine Matrix ein 28200x2 Double, aber in meiner echten Simulation werden es über 1 Millionen sein...

Zitat:
Ich habe gestern eine fast identische Frage in einem anderen Matlab-Forum gelesen. Verblüffend.


In der Tat ein lustiger Zufall. Ich bin aber in keinem weiteren Matlab-Forum angemeldet und hatte mich vorgestern auch noch nicht mit diesem Teil befasst - falls du sowas meinst.^^

Zitat:
Der gepostete Code läuft nicht, weil Klammern falsch gesetzt sind:


Ja stimmt in der ersten Zeile sehe ich das, aber im anderen Fall kann ich grade nicht erkennen wo die öffnende Klammer fehlt...

Das mit der for-Schleife war natürlich quatsch - da habe ich nicht ordentlich nachgedacht.

Zitat:
Code:
Code:

TrueData(any(TrueData == 0, 2), :) = [];
[T, Order] = sortrows(TrueData);
Index = [diff(T(:,2)) ~= 0, true];
Result = T(Index, :);



Danke für den Vorschlag. Komme leider bei dem Schritt mit dem Index nicht mehr ganz mit. Und wenn ich den Code copy-paste kriege ich nen error:
Error using horzcat
Dimensions of matrices being concatenated are not consistent.

Error in Vorschlag_Jan (line 17)
Index = [diff(T(:,2)) ~= 0, true];

Also du sortierst die Reihen und nimmst auch noch die Indizes seperat auf. Dann bildest du die Differenz aller Z-Koordinaten. Aber immer nur die Differenz der anliegenden Koordinate, richtig? Das verstehe ich nicht genau, warum du das machst. Die Z-Koord liegen ja jetzt unsortiert in der Matriox T vor.
Verstehe von der Syntax leider auch das "true" nicht. Du öffnest ja eine Matrix mit Namen "index" und in der ersten Spalte sind die Differenzern und in der zweiten Spalte dann was?

Dass die Z-Koord jetzt nicht sortiert sind wusstest du wahrscheinlich nicht. (Siehst ja keine Daten) Also wenn ich jetzt nach z sortiere und dann nach dem anderen:
Code:
[T, Order] = sortrows(TrueData,[2 1]);


und dann diese Differenz bilde, dann kriege ich sehr viele Nullen und bei Sprüngen in der z-Koordinate etwas anderes. Aber ich verliere eine Zeile, richtig?
Komme noch nicht ganz klar^^
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.