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

Löschen von bestimmten Zeilen einer Matrix

 

gruenertee
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 57
Anmeldedatum: 15.08.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.08.2015, 15:09     Titel: Löschen von bestimmten Zeilen einer Matrix
  Antworten mit Zitat      
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=[5 6 7 8 10 15 11 12 13 14 15; 1 2 3 4 5 6 7 8 7 6 5]'
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,Smile=C(i,Smile; %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?

matlab.mat
 Beschreibung:
Das die C Matrix

Download
 Dateiname:  matlab.mat
 Dateigröße:  285 Bytes
 Heruntergeladen:  251 mal
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: 13.08.2015, 16:45     Titel: Re: Löschen von bestimmten Zeilen einer Matrix
  Antworten mit Zitat      
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.

Der Code enthält Probleme:
Code:
   elseif C(i+1,2)<C(i,2) && C(i-1,2)>C(i,2)

i-1 wird scheitern wenn i==1 ist.

Code:
   else C(i+1,2)<C(i,2) && C(i-1,2)<C(i,2)

Wozu soll hier die Bedingung hinter else dienen? Die ist da vollkommen überflüssig.

Einfach ist wohl ein Ansatz mit diff ;
Code:
C=[5 6 7 8 10 15 11 12 13 14 15; 1 2 3 4 5 6 7 8 7 6 5]'
match = diff(C(:, 2));
index = (match(2:end) > 0 | (match(2:end) < 0 && match(1:end-1) > 0);
D = C(index, :);

Ob das nun das gewünschte ist, weiß ich nicht, da der Original-Code ja nicht fehlerfrei lief.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 57
Anmeldedatum: 15.08.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.08.2015, 18:07     Titel:
  Antworten mit Zitat      
Vielen Dank Jan!

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!
Private Nachricht senden Benutzer-Profile anzeigen
 
gruenertee
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 57
Anmeldedatum: 15.08.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.08.2015, 10:22     Titel:
  Antworten mit Zitat      
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=[5 6 7 8 10 15 11 12 13 14 15; 1 2 3 4 5 6 7 8 7 6 5]'
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.

Bisher: Letzte Eintrag in D C(7,2)...

Vielen Dank!
Private Nachricht senden Benutzer-Profile anzeigen
 
gruenertee
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 57
Anmeldedatum: 15.08.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.08.2015, 15:33     Titel:
  Antworten mit Zitat      
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
Code:
umgewandelt habe.
Vielleicht hat ja jemand eine elegantere Lösung parat?!

Hier meine Lösung:
Code:

C=[5 6 7 8 10 15 11 12 13 14 15; 1 2 3 4 5 6 7 8 7 6 5]'
match = diff(C(:, 2));
index = (match(2:end) > 0 | (match(2:end) < 0 & match(1:end-1) > 0));
h=C(1,:)./C(1,:);
index=[h(1);index];
index=logical(index);
D = C(index, :);  

 
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: 18.08.2015, 02:25     Titel:
  Antworten mit Zitat      
Hallo gruenertee,

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=[5 6 7 8 10 15 11 12 13 14 15; 1 2 3 4 5 6 7 8 7 6 5]'
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.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 57
Anmeldedatum: 15.08.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.08.2015, 13:46     Titel:
  Antworten mit Zitat      
Hallo Jan,

an dieser Stelle erstmal vielen Dank für deine gute und verständliche Antwort; mit
Code:
h=C(1,:)./C(1,:)
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
Code:
(match(2:end) > 0 | (match(2:end) < 0 & match(1:end-1) > 0
durchgehe, fehlt mir für
Code:
C(index, :)
ein Eintrag mit true bzw. 1;
Code:
match(2:end) > 0
findet mir 6mal und
Code:
(match(2:end) < 0 & match(1:end-1) > 0
findet mir einmal eine "1". aber die Spalte
Code:
C(:,2)=1 2 3 4 5 6 7 8
hat 8 Elemente auf die die "match" Suche zutreffen sollte .

Aber nochmals Danke Jan!

Gruß[/code]
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.