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 mit if - Abfrage bearbeiten

 

Lini
Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 26.12.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.12.2016, 12:18     Titel: Spaltenvektor mit if - Abfrage bearbeiten
  Antworten mit Zitat      
Hallo,

ich habe ein Problem bei der Erstellung von Matlab Funktionen, die einen Spaltenarray abarbeiten sollen. Mein code sieht folgendermaßen aus:

Code:
[x, y] = v1(F)

y(1) = 12.5;

    if (F- 50 < - 0.2)
        x= 1;
    elseif (F- 50 > 0.2)
        x= - 1;
    elseif abs(F- 50 < 0.001)
        x= 0;        
    else
        x= (50 - F)*(1/0.2)
    end
   
y = y(-1) + x;
 

Wenn ich auf diese If- Abfrage Für Freq einen Wert gebe dann wird die if- Abfrage vernünftig ausgeführtrt, bei einem array wird immer nur das else ausgeführt. Die Funktion passt nur, wenn ich den code mit einer for- Schleife mache. Das will ich allerdings vermeiden, da ich mehrere Millionen Werte abfragen muss.

Der letzte Term y = y(-1) + x; wird so auch nicht ausgeführt. Dies könnte ich zwar mit dem Befehl y=y(1)+ cumsum(x) lösen, brauche aber den Befehl auf eine zurückliegende Zeile zuzugreifen auch zur Erweiterung des Codes.

Ich bin über jede Hilfe sehr dankbar, da ich echt keine Ideen mehr habe und das Internet und Bücher konnten mir auch nicht wirklich helfen.
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

schau dir mal logische Indizierung (logical indexing) an.

Der Anfang wäre:
Code:
x = zeros(size(F));
x(F-50 < -0.2) = 1;


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

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 26.12.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.12.2016, 23:57     Titel:
  Antworten mit Zitat      
Vielen Dank dafür, das hat auf jeden Fall sehr geholfen.

Habe ich denn jetzt auch die Möglichkeit auf Spalten zuzugreifen, die beispielsweise 10 sekunden (also 10 spalten in diesem Fall) zurückliegen, oder die erst 10 sekunden später kommen?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

grundsätzlich per Indizierung. Beispielsweise würde ein mathematisches
y(t) = x(t) + x(t-10)
zu etwas wie
Code:
y = x;
y(11:end) = x(11:end) + x(1:end-10);


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

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 26.12.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.12.2016, 23:57     Titel:
  Antworten mit Zitat      
Vielen Dank für deine Unterstützung! So komm ich mit der Indizierung aber leider nicht ganz zurecht. Wenn ich mir beispielsweise mit folgendem Code die Zeile y = x(n-1) ausgeben lassen möchte
Code:

x(1) = 12.5;
y(1)= x(1);
y(2:end) = x(2:end -1);
x= [13.5:20.5]


bekomme ich anstelle des Arrays nur die 12.5 ausgegeben. Und wenn ich das folgendermaßen versuche:

Code:
y(2:end) = x(m -1);


bekomme ich immer den Fehler: Subscript indices must either be real positive integers or logicals.

Kann man da irgendwas machen da der Array x bzw. andere Arrays von den zurückliegenden X-Werten beeinflusst werden?

[EDITED, Jan, Bitte Code-Umgebung verwenden - Danke!]
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

x muss definiert und y vorbelegt werden, bevor die Indizierung erfolgt.
Die Anzahl der extrahierten Werte und der hineinzuschreibenden muss übereinstimmen.

Um dir mit der Fehlermeldung zu m weiterzuhelfen, müsste man wissen, was m ist.
Sofern m kein Vektor ist, wird das aber auch wieder nur eine Zahl zurückgeben.

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

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 26.12.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.12.2016, 09:53     Titel:
  Antworten mit Zitat      
Hallo,

wenn ich das jetzt richtig verstanden habe sollte folgende Funktion mit der Inputvariablen z = [15:20]

Code:


function y = xy(z)

x = zeros(size(z));
y = x;
y(2:end) = x(2:end) + x(1:end -1);
x = 2 * z;

end

 


als y-Wert den Vektor [0, 30, 32, 34, 36, 38] liefern? Ich bekomme aber immer einen Vektor mit Nullen ausgegeben. Oder liege ich da falsch?

Zitat:
Um dir mit der Fehlermeldung zu m weiterzuhelfen, müsste man wissen, was m ist.
Sofern m kein Vektor ist, wird das aber auch wieder nur eine Zahl zurückgeben.


Hier habe ich versucht m als Index nutzen. In diesem Fall sah die ganze Funktion in etwa so aus:

Code:


function y = xz(z)

m = find(z);
x = zeros(size(z));
y = x;
y(1)=12.5;
y(2:end) = x(m-1);
x = 2 * z;

end

 


Mit der Fehlermeldung: Subscript indices must either be real positive integers or logicals.

Error in xz (line 6)
y(2:end) = x(m-1);


Viele Grüße,
Lini
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 30.12.2016, 10:51     Titel:
  Antworten mit Zitat      
Hallo,

gehe den Code doch am besten mal Zeile für Zeile durch, so wie MATLAB es auch macht.
Code:
x = zeros(size(z)); % x besteht aus Nullen
y = x; % y auch
y(2:end) = x(2:end) + x(1:end -1); % weiterhin, da nur mit Nullen gearbeitet wird
x = 2 * z; % erst jetzt ist x oder y nicht 0, aber das hat keine "Rückwirkung"


Vermutlich meinst du sowas:
Code:
x = 2 * z;
y = x;
y(2:end) = x(2:end) + x(1:end -1);


Bei der zweiten Funktion verstehe ich noch weniger, was sie machen soll, insbesondere das find. Wenn m danach 1 enthält, bekommst du natürlich ein Problem, wenn du später 1 abziehst und somit 0 als Index verwendest.

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

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 26.12.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.12.2016, 13:04     Titel:
  Antworten mit Zitat      
Hallo Harald,

Ich glaube ich hab mein Problem Verstanden.

Vielen Dank für deine Hilfe!

gruß
Lini
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.