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

Hilfe bei if/for Schleife

 

fun123abc
Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 25.04.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.07.2020, 08:54     Titel: Hilfe bei if/for Schleife
  Antworten mit Zitat      
Hallo zusammen,

ich stehe aktuell vor einer kleinen Herausforderung mit einer Schleife.
Ich habe einen 3D Plot und möchte Zeilen bzw Spalten von Matrizen löschen, um das ganze etwas zu verschieben in X bzw Y Richtung.

X und Y sind Werte von 1-256. Um Zeilen bzw. Spalten zu löschen habe ich den folgenden Code:

Code:

A(256,:)=[]  %lösche i-te Zeile der Matrix A (Shift in Y)
A(:,256)=[] %lösche j-te Spalte der Matrix A(Shift in X)
B(1,:)=[] %löscht i-te Zeile der Matrix B(Shift in y)
B(:,1)=[] %löscht j-te Spalte der Matrix B (Shift in X)
 


Wenn ich den 3D Plot jetzt zum Beispiel um Y = 2 verschieben möchte, dann würe ich folgendes machen:


Code:

A(256,:)=[]  %lösche i-te Zeile der Matrix A (Shift in Y)
B(1,:)=[] %löscht i-te Zeile der Matrix B(Shift in y)

A(255,:)=[]  %lösche i-te Zeile der Matrix A (Shift in Y)
B(1,:)=[] %löscht i-te Zeile der Matrix B(Shift in y)
 


Also zwei mal das ganze in Y-Richtung durchlaufen. Ich würde das gerne automatisieren. D.h. das Programm soll das mit einer Schleife automatisch 2 mal durchlaufen. Leider komme ich hier nicht weiter.

Ich habe mir folgendes überlegt, was leider nicht funktioniert:

Code:

YVerschiebung = 2;  %Beispielwert

n = YVerschiebung;

if n > 0;
A(256 - n- (n-1),:)=[]  
B(1,:)=[]

end


Er soll in jedem Durchlauf eine Zeile bzw. Spalte löschen. D.h. bei n = 2 soll er im ersten Durchlauf 256 löschen, im zweiten Durchlauf 255. Der aktuelle Code funktioniert leider noch nicht, ich stehe etwas auf dem Schlauch
Private Nachricht senden Benutzer-Profile anzeigen


T16
Forum-Century

Forum-Century


Beiträge: 145
Anmeldedatum: 31.01.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.07.2020, 09:38     Titel:
  Antworten mit Zitat      
Du hast bestimmt if mit for verwechselt Wink IF steht für FALLS und führt Code ein mal aus falls die Bedingung erfüllt ist, leitet aber keine Schleife ein. Dafür brauchst du FOR

Code:


for i=1:n
A(256-n+1,:)=[];
B(1,:)=[];
end
 


Eine Schleife ist hier aber nicht die optimale Lösung, da die Matrizen in jedem Schleifendurchlauf ihre Größe ändern. Das wird bei vielen Schleifendurchläufen und großen Matrizen langsam. Besser ist hier eine Vektorisierung

Code:

A(256-n+1:256,:)=[];
B(1:n)=[];
 
Private Nachricht senden Benutzer-Profile anzeigen
 
fun123abc
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 25.04.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.07.2020, 10:21     Titel:
  Antworten mit Zitat      
Hallo, vielen Dank für deine Hilfe! Du hast natürlich recht, mit der for Schleife lässt sich das besser lösen. Ich wollte mit der if Schleife zunächst einmal abfragen, ob die X- bzw. Y Verschiebung überhaupt größer als 0 ist und die Schleife damit durchlaufen werden muss, aber das wird ja bereits durch die for Schleife erledigt. Ich habe es nun etwas abgeändert:

Code:

n= 0 %Beispielwert
for i=1:n
    A(256-n+1,:) = [];
    B(1,:) = [];
end

u = 2 %Beispielwert
for i=1:u
   A(:,256-u+1) = [];
   B(:,1) = [];
end
 


Wenn ich das richtig verstanden habe, sollte er falls n = 0 oder u = 0 sind die Schleife ja gar nicht durchlaufen. D.h. in diesem Beispiel müsste er lediglich letztere Schleife durchlaufen, oder?

Noch eine Frage zu der Schleife: Ich möchte damit beginnen, die 256. Zeile/Spalte zu löschen. Lautet die Schleife allerdings wie jetzt, 256-n+1, dann beginne ich ja nicht bei 256, sondern lösche 255 und anschließend 254. Oder habe ich da einen Denkfehler? Müsste es nicht heißen for i = =0:n-1 ?
Private Nachricht senden Benutzer-Profile anzeigen
 
T16
Forum-Century

Forum-Century


Beiträge: 145
Anmeldedatum: 31.01.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.07.2020, 10:33     Titel:
  Antworten mit Zitat      
Zitat:
Wenn ich das richtig verstanden habe, sollte er falls n = 0 oder u = 0 sind die Schleife ja gar nicht durchlaufen. D.h. in diesem Beispiel müsste er lediglich letztere Schleife durchlaufen, oder?


Richtig, probier es einfach aus, dann siehst du ja sofort welche Schleife durchlaufen wird Wink

Zitat:
Noch eine Frage zu der Schleife: Ich möchte damit beginnen, die 256. Zeile/Spalte zu löschen. Lautet die Schleife allerdings wie jetzt, 256-n+1, dann beginne ich ja nicht bei 256, sondern lösche 255 und anschließend 254. Oder habe ich da einen Denkfehler? Müsste es nicht heißen for i = =0:n-1 ?


Bei n=1: 256-n+1=256
Bei n=2: 256-n+1=255

Deine Variante mit i=0:n-1 geht nat. auch, dann fällt die + 1 weg. Ist vielleicht intuitiver.
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 - 2024 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.