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

Dynamische Schleifenprogrammierung

 

Slamdunker23
Forum-Century

Forum-Century


Beiträge: 101
Anmeldedatum: 03.11.09
Wohnort: Stuttgart
Version: R2012b
     Beitrag Verfasst am: 11.01.2012, 11:06     Titel: Dynamische Schleifenprogrammierung
  Antworten mit Zitat      
Hallo zusammen,
ich habe ein Frage bezüglich einer dynamischen Schleifenprogrammierung. Im Folgenden findet ihr einen einfachen Quellcode, der das Thema widerspiegelt:

Code:

A = [0 1; 2 3; 4 5; 6 7; 8 9];
[rows, columns] = size(A);

for a = 1:rows
    if A(a,1) == 4
        A(a,:) = [];
    end
end
 


Die Schleife zählt die Zeilen der Matrix durch. Innerhalb der Schleife wird eine Zeile der Matrix gelöscht. Da der Endwert der Schleifendurchzählung zu Beginn fix ist, kommt eine Fehlermeldung, da am Ende (bei diesem Beispiel) eine Zeile fehlt!

Wie kann ich sozusagen den Endwert der Schleifendurchzählung dynamisch an die Ausführungen innerhalb der Schleife knüpfen?

Vielen Dank für eure Hilfe!
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

eine Möglichkeit wäre, die Schleife rückwärts laufen zu lassen.

Es geht jedoch viel einfacher und schneller:

Code:
A( A(:,1) == 4, : ) = [];


(Stichwort: logical indexing)

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Slamdunker23
Themenstarter

Forum-Century

Forum-Century


Beiträge: 101
Anmeldedatum: 03.11.09
Wohnort: Stuttgart
Version: R2012b
     Beitrag Verfasst am: 11.01.2012, 12:15     Titel:
  Antworten mit Zitat      
Logical Indexing ist eine sehr gute Hilfe, aber ich weiß nicht, ob sie bei meinem Problem hilft.
Bei der vorhin geposteten logischen Operation klappt das.

Wie kann ich das damit aber umsetzen, wenn ich eine Matrix durchsuchen will, ob die jeweiligen Zeilenelemente der ersten Spalte gleich sind wie das darauffolgende Zeilenelement der ersten Spalte.
Falls dies der Fall ist, soll die darauffolgende Zeile gelöscht werden.

Das bedeutet, die logische Operation ist nicht nur ein Vergleich, sie bezieht auch noch die darauffolgende Zeile mit ein.

Geht dies ebenfalls mit dem Logical Indexing?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

Code:

remove =  [false; diff(A(:,1)) == 0];
A(remove, :) = [];

diff berechnet den Unterschied aufeinanderfolgender Elemente.
== 0 testet, ob der Unterschied 0 ist, die Elemente also gleich sind.
Das vorangestellte false sorgt dafür, dass die erste Zeile nicht gelöscht wird.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Slamdunker23
Themenstarter

Forum-Century

Forum-Century


Beiträge: 101
Anmeldedatum: 03.11.09
Wohnort: Stuttgart
Version: R2012b
     Beitrag Verfasst am: 11.01.2012, 12:44     Titel:
  Antworten mit Zitat      
Mit meiner Anfangsmatrix A und deinem Code bekomme ich eine Fehlermeldung, bzgl positiven und logischen Indizes.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

bitte die genaue Fehlermeldung und möglichst eine (kleine) Matrix, bei der das Problem auftritt, posten.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Slamdunker23
Themenstarter

Forum-Century

Forum-Century


Beiträge: 101
Anmeldedatum: 03.11.09
Wohnort: Stuttgart
Version: R2012b
     Beitrag Verfasst am: 11.01.2012, 14:04     Titel:
  Antworten mit Zitat      
A = [0 1; 2 3; 4 5; 6 7; 8 9];

Das ist die Matrix und das die Fehlermeldung:

??? Subscript indices must either be real positive integers or logicals.

Code:

A = [0 1; 2 3; 4 5; 6 7; 8 9];
remove =  [false; diff(A(:,1)) == 0];
A(remove, :) = [];  
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

bei mir läuft dieser Code. Meine Vermutung ist, dass noch irgendwelche andre Sachen im Workspace liegen, die hier Probleme verursachen.

Also mal alle Daten speichern, dann
Code:

und dann nochmal versuchen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Slamdunker23
Themenstarter

Forum-Century

Forum-Century


Beiträge: 101
Anmeldedatum: 03.11.09
Wohnort: Stuttgart
Version: R2012b
     Beitrag Verfasst am: 11.01.2012, 15:09     Titel:
  Antworten mit Zitat      
Danke dir, es funktioniert!

Ich habe Matlab-Hilfe zur Matrix Indexing gelesen, unter Anderem auch das topic über das logical indexing.
Wenn ich das richtig verstehe, soll dadurch die Skripte einfacher gemacht werden, das bedeutet so wie in meinem Fall, dass die Schleife durch gerade dieses indexing ersetzt wird?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

die Skripte (oder Funktionen) werden dadurch kürzer, oft lesbarer, und vor allem sehr oft auch effizienter.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Slamdunker23
Themenstarter

Forum-Century

Forum-Century


Beiträge: 101
Anmeldedatum: 03.11.09
Wohnort: Stuttgart
Version: R2012b
     Beitrag Verfasst am: 11.01.2012, 16:17     Titel:
  Antworten mit Zitat      
Danke für deine Hilfe!
Mal abgesehen von dem logical indexing, wie würde es aussehen die Schleife aus Post#1 rückwärts zählen zu lassen und wie würde das meinem Problem ebenfalls helfen?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

Code:
for a = rows:-1:1
    if A(a,1) == 4
        A(a,:) = [];
    end
end


Bei deiner Variante war ja das Problem, dass von 10 Zeilen beispielsweise die 5. herausgelöscht wird; die letzte Zeile ist dann die 9. Wenn du die Schleife rückwärts laufen lässt, ist das egal, weil du ja nur vorherige Zeilen brauchst.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Slamdunker23
Themenstarter

Forum-Century

Forum-Century


Beiträge: 101
Anmeldedatum: 03.11.09
Wohnort: Stuttgart
Version: R2012b
     Beitrag Verfasst am: 11.01.2012, 16:38     Titel:
  Antworten mit Zitat      
Danke!
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.