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

Spaltenvektor durchlaufen und Wert +/- 1 add/sub

 

Tino97
Forum-Anfänger

Forum-Anfänger


Beiträge: 23
Anmeldedatum: 21.06.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.07.2017, 16:42     Titel: Spaltenvektor durchlaufen und Wert +/- 1 add/sub
  Antworten mit Zitat      
Hallo,

ich möchte in einem Spaltenvektor immer "1" abziehen, wenn es eine positive Zahl ist und "1" hinzufügen, wenn es eine negative Zahl wird. D.h. aus -5 soll -4 und 5 soll 4 werden usw.

Dies hat leider noch nicht so ganz geklappt und ich bin nicht sicher was genau falsch läuft.

Code:

a=[-5:5]';
n=length(a)
for k=1:n
   
    if a(n)<0
        a(n)=a(n)+1
    elseif a(n)>0
        a(n)=a(n)-1
      end
end
 


Kann mir jemand vielleicht einen Rat geben?

MfG
Tino
Private Nachricht senden Benutzer-Profile anzeigen


denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 12.07.2017, 17:19     Titel:
  Antworten mit Zitat      
Hallo nutze doch SIGN-Funktion, dafür

Code:

a=(-5:5)';

a= a + sign(a)*-1
 


Zuletzt bearbeitet von denny am 13.07.2017, 05:11, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
Tino97
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 23
Anmeldedatum: 21.06.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.07.2017, 18:05     Titel: Danke
  Antworten mit Zitat      
Hallo denny,

danke für die Rückmeldung. Den Befehl kannte ich noch nicht (und ich bin echt geschockt wie wenig code man braucht Shocked ).
Aber kann ich meine "umständlichere" Variante auch irgendwie zum Laufen bringen? Ich würde gerne mehr dazulernen, weil ich bisher nur sehr wenig mit Matlab bzw. Programmieren zu tu hatte.

Gruß
Tino
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: 12.07.2017, 18:06     Titel: Re: Spaltenvektor durchlaufen und Wert +/- 1 add/sub
  Antworten mit Zitat      
Hallo Tino97,

Der Code hat nur einen kleinen Bug:

Code:

a = (-5:5)';
n = length(a)
for k=1:n
    if a(k)<0           % a(n) --> a(k)
        a(k)=a(k)+1
    elseif a(k)>0
        a(k)=a(k)-1
      end
end

Du brauchst überall a(k) statt a(n), ansonsten wird nur der letzte Wert bearbeitet.

Alternativ ohne Schleife:

Code:

a = (-5:5)';
a(a<0) = a(a<0) + 1;
a(a>0) = a(a>0) - 1;

Ich habe übrigens in "[-5:5].'" die eckigen in runde Klammern geändert, denn "[]" ist in Matlab der "concatenation"-Operator. Es werden also einzelne Arrays horizontal oder vertical verbunden. "-5:5" ist aber bereits ein Vektor und er ist das einzige Array. Das ist zwar kein Fehler, aber die Benutzung unnötiger eckiger Klammern raubt Zeit und ist irreführend.

Während in diesem Fall der Zeitverlust gerade so eben messbar ist, ist das in for Schleifen oder bei Indices schon deutlich:
Code:
x = zeros(1, 10000);
tic
for k = 1:10000
  x(1:k) = k;
end
toc

x = zeros(1, 10000);
tic
for k = 1:10000
  x([1:k]) = k;    % <-  [...] added
end
toc

Elapsed time is 0.087256 seconds.
Elapsed time is 0.374184 seconds. Faktor 4!

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 23
Anmeldedatum: 21.06.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.07.2017, 18:53     Titel:
  Antworten mit Zitat      
Hallo Jan,

das mit dem n habe ich mindestens 20x übersehen, danke Dir.

Die Sache mit den Klammern nehme ich auch gerne mit. Wieder etwas gelernt.

MfG
Tino
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: 12.07.2017, 19:23     Titel:
  Antworten mit Zitat      
Hallo Tino97,

Zitat:
das mit dem n habe ich mindestens 20x übersehen, danke Dir.

Gerne. Das ist unter Programmierern ein bekanntes Phänomen: Weil man weiß, was man beabsichtig hat, erkennt man einen Bug nicht mehr auf dem Bildschirm. Je banaler der Fehler, desto unsichtbarer ist er. Es gibt dafür 2 Lösungen:

1. Jemand anderen fragen (Forum, Kollege, Katze)

2. Aufstehen, Kaffee trinken, Kuchen essen, im besten Fall schlafen gehen. Dann später wieder auf den Code schauen.

Gruß, Jan
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.