Verfasst am: 13.08.2015, 15:09
Titel: Löschen von bestimmten Zeilen einer Matrix
Hallo goMatlab-User,
solange in der zweiten Spalte der Matrix C die Einträge von Zeile zu Zeile größer werden möchte ich die Matrix D mit den Einträgen aus der Matrix C füllen; aber sobald in der Spalte 2 von C die Werte von Zeile zu Zeile kleiner werden soll er nur nicht mehr schreiben bzw die Einträge löschen über: []
Code:
C=[567810151112131415; 12345678765]'
D=C;
for i=1:length(C)-1 if C(i+1,2)>C(i,2)
D(i,:)=C(i,:);
elseif C(i+1,2)<C(i,2) && C(i-1,2)>C(i,2)
D(i,:)=C(i,:);
else C(i+1,2)<C(i,2) && C(i-1,2)<C(i,2) % D(i,=C(i,; %erst Matrix aufbauen, um dann die doppelten Werte zu löschen
D(i,:)=[]; %hier wird gelöscht
end end
Edit: also für die oben angegebene Matrix C funktioniert der Code noch nicht ganz ^^, aber ebenso wenig für die Matrix meiner .mat Datei; hat da jemand eine Erklärung?
Verfasst am: 13.08.2015, 16:45
Titel: Re: Löschen von bestimmten Zeilen einer Matrix
Hallo gruenertee,
Bitte beschreibe immer, welche Effekte Du siehst. "Funktioniert noch nicht ganz" ist zu vage, um effizient darauf zu antworten.
Wenn Du D(i, :) löschst, wird die Zeile später wieder erzeugt, wenn Du in der nächsten Iteration D(i+1, :) wieder erzeugst. Hier ist der Ansatz mit der Schleife also tückisch. Beim Löschen verschiebt sich die Matrix.
Deine Lösung ist sehr elegant und nicht so klobig umständlich wie meine. Und deine Anmerkung mich genauer auszudrücken trifft vollkommen zu, als ich meinen Forumeintrag nochmal gelesen hatte ist mir auch die schwammige Beschreibung ins Auge gefallen!
Hallo,
an dieser Stelle muss ich meine vorherige Aussage ein wenig revidieren, denn leider wird so mein Problem noch nicht ganz gelöst; Beim Ausführen des Codes verschluckt der D-Vektor leider die Zeile 8. Also der letzte eintrag bei dem diff(C(:,2)) noch größer als null ist. Der jetzige Code gibt mir unter Index sieben mal true aus, aber für die 8 Zeile sollten es 8 mal true sein. Sieht jemand den Fehler oder könnte mir weiterhelfen?
Code:
C=[567810151112131415; 12345678765]'
match = diff(C(:, 2));
index = (match(2:end) > 0 | (match(2:end) < 0 & match(1:end-1) > 0));
D = C(index, :);
Problem zu lösen: Solange in C(:,2) die Differenz zwischen nächster Zeile und aktueller Zeile größer ist als 0 möchte ich die Matrix C in D schreiben. Der letzte Eintrag soll dann derjenige sein, wo die nächste Zeile in C(:,2) wieder kleiner ist als der vorherige Eintrag; also hier wäre es C(8,2) der letzte in D zu schreibende Eintrag.
Also ich habe jetzt eine Lösung für mein Problem gefunden, indem ich einfach dem Vektor "index" eine zusätzliche Zeile mit einer 1 hinzugefügt habe und diesen Vektor dann über den Befehl
JA, meine Lösung gab nur 7 Elemente, da mit nicht klar war, was mit dem ersten geschehen soll. Das ist es jetzt immer noch nicht:
Wozu dient:
h=C(1,:)./C(1,:)
? Das ergibt ja auf jeden Fall Einsen, oder?
Dann wäre dies einfacher:
Code:
C=[567810151112131415; 12345678765]'
match = diff(C(:, 2));
index = [true, (match(2:end) > 0 | (match(2:end) < 0 & match(1:end-1) > 0))];
D = C(index, :);
Das Wechseln eines Typs einer Variablen bremst Matlab übrigens sehr aus. Vermeide deshalb konversionen wie "index=logical(index)" sondern verwende besser eine neue Variable.
wollte ich einfach nur ein element erzeugen dass = 1 ist um es in den index Vektor einzuschieben, da diesem ja eine 8te 1 sozusagen fehlt. Deine Lösung funktioniert soweit, vielen Dank dafür.
Was das eigentliche Problem ist, ist ja das wenn ich die Bedingung
hat 8 Elemente auf die die "match" Suche zutreffen sollte .
Aber nochmals Danke Jan!
Gruß[/code]
Einstellungen und Berechtigungen
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
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.