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

Funktion "tue nichts"

 

bozena
Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 17.02.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.06.2012, 12:59     Titel: Funktion "tue nichts"
  Antworten mit Zitat      
Hallo,

ich habe eine generelle Frage, zu den Funktionen. Dazu erkläre ich am besten mein Problem. Ich habe ein M-File geschrieben, indem Werte aus einer Excel-Datei eingelesen werden. Dabei liest Matlab aus zwei Spalten ein. In der einen Spalte gibt es in jeder Zeile Werte. In der anderen Spalte sind einige Zeilen leer. Ich will, dass Matlab die beiden Spalten addiert, ist die eine Zeile leer, so soll er den letzten Wert weiterverwenden. Erst wenn aus der leeren Zeile eine Zeile mit Wert wird, soll er den neuen Wert verwenden. Ich bin aber nicht sicher, ob das überhaupt geht. Ich habe einen Ausschnitt aus diesem Teil genommen, alle Variablen sind definiert und der Code läuft auch, wenn ich die Einschränkung weglasse. B ist die Spalte mit Werten, und S ist die Spalte, mit den leeren Zeilen.
Code:
for i = 1:D_1;
    for j = 1:S_1;
       
        A(i) = B(i) + C*S(j);
   
        i = i+1;
        j = j+1;
       if isempty(S(j))
          %an dieser Stelle weiß ich nicht weiter. Kann ich Matlab sagen, "zähle solange weiter, bis ein Wert in der Zeile auftaucht, in der zwischenzeit benutze den letzten Wert"??
       end        
       
    if B(end);
        break
    end
   
    end
end
 


Oder muss ich da anders herangehen?
Danke für die Hilfe!
Private Nachricht senden Benutzer-Profile anzeigen


Sirius3
Forum-Guru

Forum-Guru


Beiträge: 441
Anmeldedatum: 11.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.06.2012, 16:24     Titel:
  Antworten mit Zitat      
Hallo Bozena,

es ist immer eine schlechte Idee innerhalb von For-Schleifen die Schleifenvariable zu
verändern (Zeile mit i=i+1) da sie beim nächsten Durchgang überschrieben wird.
Wenn B und S zwei Spalten sind, was sind dann D_1 und S_1?
Da A(i) bei jedem Durchgang der inneren j-Schleife wieder überschrieben wird, ist
sie überflüssig. Außerdem bricht die innere Schleife immer nach dem ersten Durchlauf
ab, wenn das letzte Element in B (B(end)) ungleich 0 ist.
Wie kann eine Zeile leer sein, wenn S ein Vektor mit Zahlen ist? Ich kenne Deine
Einleseroutine nicht. Werden leere Zeilen als NaN oder 0 geschrieben?
Für den Fall NaN:
Code:
letzter_gueltiger_wert=0;
for i = 1:length(B)
    if isfinite(S(i)); letzter_gueltiger_wert=S(i);end;
    A(i) = B(i) + C*S(i);
end;


Grüße
Sirius
Private Nachricht senden Benutzer-Profile anzeigen
 
bozena
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 17.02.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.06.2012, 19:05     Titel:
  Antworten mit Zitat      
Hallo Sirius,

danke für deine Antwort! Ich möchte die Werte natürlich nicht überschreiben, sondern als Ergebnisvektor in eine andere Spalte bei Excel reinschreiben lassen. Ich versuche es daher nochmal, ohne Schleife, wobei mein altes Problem bleibt. C ist eine Konstante. B und S sind gleich lang. S ist jetze ein Vektor, der in unregelmäßigen Abständen eine Wert aufweist und ansonsten Nullen enthält also z.B. S = [1;0;0;0;6;0;0;0;0;7;0;4;0]. Die Berechnung soll so erfolgen, dass sobald S=0 ist, der letzte Wert ungleich Null für die Rechnung genommen werden soll.
Code:

i = 1:length(B)-1; k = 1:length(S)-1;    

A(i) = B(i) +C*S(k);
   
      i = i+1;
k = k+1;

 A =A';


So wie der Code jetzt ist, wird für S=0, die Null zur Berechnung genommen, soll sie aber nicht. Gibt es Lösungsansätze?
Grüße, Bozena
Private Nachricht senden Benutzer-Profile anzeigen
 
Sirius3
Forum-Guru

Forum-Guru


Beiträge: 441
Anmeldedatum: 11.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.06.2012, 09:56     Titel:
  Antworten mit Zitat      
Hallo Bozena,

soll die letzte Zeile nicht mit berechnet werden, weil Du length(B) -1 schreibst?
Du kannst vor der Addition alle Nullen in S mit der vorherigen Zahl auffüllen
Code:
S_gefuellt=S;
for k=find(S==0)
  S_gefuellt(k)=S_gefuellt(k-1);
end;
A = B + C*S_gefuellt;


Grüße
Sirius
Private Nachricht senden Benutzer-Profile anzeigen
 
bozena
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 17.02.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.06.2012, 08:53     Titel:
  Antworten mit Zitat      
Hallo Sirius,

die letzte Zeile soll schon mitgerechnet werden. length-1 habe ich nur geschrieben, weil ich zuvor i=i+1 mitgeführt hatte.
Dein Code funktioniert leider nur für die erste und nächste Zeile jeweils. Mein S Vektor sieht z.B. folgendermaßen aus: S=[1;0;0;0;0;0;4;0;0;0;9;0;0;0;0;0;0] nur noch viel länger Wink Also unregelmäßige Anzahl von Nullen, die nacheinanderfolgen und von Zahlenwerten abgewechselt werden. Für meine Berechnung soll solange der letzte Wert verwendet werden, bis der neue Wert kommt. Also nicht mit den Nullen rechnen!
Code:
S_gefuellt=S;
for k=find(S==0)
  S_gefuellt(k)=S_gefuellt(k-1);%an dieser Stelle muss man bei jedem Schritt eine mehr abziehen, also (k-2),(k-3),...
end;
A = B + C*S_gefuellt;


Gibt es eine Möglichkeit?

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.06.2012, 12:51     Titel:
  Antworten mit Zitat      
Wieso eine mehr abziehen? Also so wie ich das verstanden habe sollte es so fuktionieren (ist vllt. nicht das eleganteste, aber ein Ansatz)
Code:

k=[1 0 0 0 3 0 0 0 0 6 0 0 0 0];
for i=1:length(k)
   if k(i) == 0
      k(i)=k(i-1);
   end
end
 

Gruß, Kascho
 
bozena
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 17.02.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.06.2012, 13:57     Titel:
  Antworten mit Zitat      
Hallo Kascho,

deinem Code zufolge läuft es doch so ab: für i=3 ist k(3)=0, also rechnet er k(3)=k(3-1)=k(2)=0! Genau das soll er ja nicht machen. Solange k=0 ist für i=1:4 soll er die 1 nehmen! Ab i=5:9, die 3 usw. (ich habe mich jetzt auf dein Beispiel für k bezogen). Deswegen muss er immer einen mehr abziehen, je weiter er kommt..

Gruß, bozena
Private Nachricht senden Benutzer-Profile anzeigen
 
Kascho1

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.06.2012, 14:50     Titel:
  Antworten mit Zitat      
hast du den den code so mal laufen lassen? Wenn er nicht das gewünschte tut, hab ich dein Problem nicht verstanden.

Wenn er auf k(i) zugreift ist einen schleifendurchlauf vorher auf k(i-1) zugriffen wurden und gegenbenfalls überschrieben.
Problem ergibt sich nur, wenn das erste element von k eine 0 ist ....
 
Sirius3
Forum-Guru

Forum-Guru


Beiträge: 441
Anmeldedatum: 11.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.06.2012, 17:32     Titel:
  Antworten mit Zitat      
Hallo bezona,

wie Kascho1 schreibt wird bei jedem Schleifendurchlauf auf k-1 zugegriffen,
das aber sollte S(k-1)==0 sein, im vorherigen Schritt den Wert von S(k-2) bekommen hat,
usw.

Bei meinem Code hat sich ein kleiner Dimensionsfehler eingeschlichen.
Code:
S_gefuellt=S;
for k=find(S(:)'==0) % hier muss ein Zeilenvektor als Ergebnis von find stehen!
  S_gefuellt(k)=S_gefuellt(k-1);
end;
A = B + C*S_gefuellt;
 

sodass die Schleife in Wirklichkeit nur einmal durchlief.

Grüße
Sirius
Private Nachricht senden Benutzer-Profile anzeigen
 
bozena
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 17.02.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.06.2012, 18:01     Titel:
  Antworten mit Zitat      
Hi Sirius,

es funktioniert genau so, wie ich es mir gewünscht habe. Vielen Dank!!

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