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

Jede Zeile einer Excel-Tabelle durchgehen

 

Anna9390
Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 14.06.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.06.2018, 10:24     Titel: Jede Zeile einer Excel-Tabelle durchgehen
  Antworten mit Zitat      
Hallo,

ich habe ein kleines Problem mit Matlab und hoffe, ihr könnt mir weiterhelfen. Ich möchte eine Excel-Datei mit 3 Spalten und 35.000 Zeilen in Matlab importieren. Das mache ich mit der Import-Data Funktion. In der ersten Spalte steht die Zeit in Minuten, also von 1 bis 35.000. In der zweiten und dritten Spalte stehen Messwerte. Die Überschriften der Spalten lauten hier a und b. Die Spaltenüberschriften werden automatisch als die Variablennamen übernommen.

Ich möchte jetzt, dass Matlab für jede Zeile, also für jeden Zeitschritt, die Differenz aus den beiden Messwerten berechnet. Dazu mache ich einfach: c=b-a;
Jetzt habe ich ja 35.000 Werte für c, richtig?

Als nächstes möchte ich, dass Matlab jede Zeile durchgeht und in Abhängigkeit von c verschiedene Anweisungen für die Berechnung von d ausführt. Am Ende, wenn das Programm für jede Zeile d ausgerechnet hat, möchte ich die Summe von d ausgegeben haben.

Beispiel:
Zeit=1:
if c>0
d=c*eta;
else
d=0;

d_ges=d_ges+d;

Hat jemand eine Idee wie ich das mache?
Ich habe es mit einer for-Schleife probiert (for Zeit 1:35000), das funktioniert bisher nicht.

Ich hoffe jemand kann mir weiterhelfen.

Grüße, Anna
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: 21.06.2018, 11:10     Titel: Re: Jede Zeile einer Excel-Tabelle durchgehen
  Antworten mit Zitat      
Hallo Anna9390,

Bitte poste eine Kopie Deines Codes und erkläre "funktioniert bisher nicht" mit Details: Bekopmmst Du eine Fehlermeldung? Dann füge eine Kopie der vollständigen Meldung ein. Oder weicht das ergebnis von Deinen Erwartungen ab? Falls ja, erkläre den Unterschied.

Vermutlich wird etwas in dieser Art helfen:
Code:
 d_ges = sum(c(c > 0)) * eta;

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 14.06.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.06.2018, 11:52     Titel:
  Antworten mit Zitat      
Hallo Jan,

das ist mein Code:

Code:

%Parameter
eta=0.8;

%Anfangswerte
W_s=0;  
n=0;  
d_ges=0;
W_n_ges=0;
W_g_ges=0;

%Excel-Tabelle einlesen
data=xlsread('Daten.xlsx')

%Variablennamen
Zeit = data(:,1);
a = data(:,2);
b = data(:,3);

c=b-a;


for Zeit=1:35040
    if c>0    
        d=c*eta;      
        n=n+1;
        W_g=0;
        if W_s<W_s_max
           W_s=W_s+d;
           W_n=0;
        else W_n=d;
        end
    else
        d=0;
        e=c/4;
        W_n=0;
        if W_s>0
           W_s=0;
           W_g=0;
        else W_g=e;
        end
    end
d_ges=d_ges+d;
W_n_ges=W_n_ges+W_n;
W_g_ges=W_g_ges+W_g;
end
 


Eine Fehlermeldung bekomme ich zwar nicht, aber im Workspace stehen für die Werte d, d_ges, n, W_n und W_n_ges Nullen. Für e, W_g und W_g_ges steht bei Value 35040x1 double. Das verstehe ich jetzt so, dass das Programm immer in die zweite bedingung, c<=0 springt. Aber das stimmt nicht, c ist auch häufig positiv. Ich habe die Excel-tabelle mit den Werten auch mal angefügt.

Ist das Problem verständlich erklärt?

Gruß, Anna

Daten.xls
 Beschreibung:
Excel_Tabelle mit Messwerten

Download
 Dateiname:  Daten.xls
 Dateigröße:  2.5 MB
 Heruntergeladen:  235 mal
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: 22.06.2018, 10:38     Titel:
  Antworten mit Zitat      
Hallo Anna,

Der if Befehl benötigt eine skalare Bedingung. Wenn c ein Vektor ist, is "c > 0" ebenfalls eines. Dann fügt Matlab automatisch ein all() ein, damit wieder ein Skalar heraus kommt. Um genau zu sein:
Cond = (c > 0);
if all(Cond(:)) && ~isempty(Cond)

Ich rate mal, dass bei Dir die Bedingung für jedes Element geprüft werden soll, nicht für alle gleichzeitig, oder?
Die Schleife "for Zeit=1:35040" wird zwar 35040 mal durchlaufen, aber dabei wird immer der gleiche Code ausgeführt, weil der Inhalt der Schleife gar nicht viom Schleifenzähler "Zeit" abhängt.

Du brauchst also entweder eine Abhängigkeit vom Scheifenzähler:
Code:
for Zeit=1:35040
    if c(Zeit) > 0
      ...  Und dann ÜBERALL die Abhängigkeit vom Index einfügen
 

Oder Du verwendest "logical indexing", wie bereits vorgeschlagen:
Code:
index = (c > 0);
d = c(index) * eta;
...


Viele Grüße, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Anna9390
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 14.06.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.06.2018, 12:20     Titel:
  Antworten mit Zitat      
Hallo Jan,

vielen Dank für deine Hilfe, es funktioniert jetzt Wink

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