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

Messwerte verschiedener Tage bearbeiten

 

BastiM
Forum-Anfänger

Forum-Anfänger


Beiträge: 31
Anmeldedatum: 15.07.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.07.2013, 13:06     Titel: Messwerte verschiedener Tage bearbeiten
  Antworten mit Zitat      
Servus!

ich beschäftige mich seit letzter Woche mit Matlab, und habe nun folgendes Problem:
bisher habe ich es geschafft, aus einer Excel- Datei via Import Button einmal einen cell- Array mit Datum/ Uhrzeit zu erstellen, einmal einen double- array für die Messerte und dieses dann auch zu plotten mit der Beschriftung von x- und y- Achse die ich gerne hätte...

nun würde ich gerne folgendes programmieren:

Jeder Tag ist mit Datum, Uhrzeit und Messwert in einer Excel- Datei gespeichert.
Bisher unter dem Namen: Leistung_20_60 die letzen Ziffern stellen das Datum dar und werden chronologisch verändert.

Ich würde:

1) Die Werte aus den Excel- Dateien in den Workspace importieren (werde ich wieder über den Import Button machen)

2) eine Schleife, die jeden Vektor (z.B. dann Leistung_20_06) anspricht, die Werte mit einem Faktor multipliziert, sowie dieses Ergebnis dann unter einem anderen Namen (Energie_20_06) abspeichert

ich hab es schon mit verschiedensten Codes probiert, zusammengeschustern aus Foren, klappt aber natürlich nicht, wäre ja auch zu einfach...

Ich wäre um Tips dankbar, wie eine solche schleife auszusehen hätte...nach was ich da genau suchen sollte, an was ich mich orientieren kann! Erwarte nicht dass mir hier jemand den fertigen Code postet, aber mit ein bisschen Orientierung gehts vielleicht besser....

Ich wollte ursprünglich auf den/ die Dateinamen im Workspace zugreifen, diese in einem cell- array abspeichern, dann den dort gespeicherten Namen in '*_20_06' aufteilen, diese Schnipsel wieder in einem neuen cell array speichern...
Aber ich denke es sollte auch viel einfacher gehen...

Vielen Dank für Eure Hilfe, ich hoffe mein Problem ist verständlich geschildert...

LG Basti
Private Nachricht senden Benutzer-Profile anzeigen


Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 17.07.2013, 13:14     Titel:
  Antworten mit Zitat      
es ist immer einfacher wenn du lauffähigen matlab code postest und dann sagst was nicht so klappt wie du willst. sehe ich das richtig das das datum nicht wirklich als datum vorliegt sondern in einem namen gespeichert ist ?
excel files kann man auch mit
Code:
einlesen. das kann man dann automatisieren.
poste doch einmal was du bis jetzt versucht hast, vieleicht mit beispiel excel datei und dann sag was noch nicht klappt.
variablen index im variablen namen unterzubringen ist immer schlecht für die weiterverarbeitung. ein struct oder ein cell array wäre besser denke ich
grüße winkow
Private Nachricht senden Benutzer-Profile anzeigen
 
BastiM
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 31
Anmeldedatum: 15.07.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.07.2013, 13:28     Titel:
  Antworten mit Zitat      
Das ist das Problem....
lauffähigen Code hab ich leider nicht...Was ich bisher probiert habe ist:

Code:
k = numel (LeistungkW_20_06)%größe des vektors

files = dir('LeistungkW_*'); %alle Dateinamen mit EnergiekW
names = {files.name};
names = regexprep(names,'Energie_*','') ; %Anfang entfernen
index=length(names);
for i=1:index
a(i)=str2num(cell2mat(names(i)));
end

for (i=1:1:k)
   
    Energie(i,1) = LeistungkW_2006(i,1)*0.12;
   
end
 


Hier steckt jetzt schon der Name des Vektors drin, also LeistungkW_20_06
ich sollte erstens wohl einen anderen Namen verwenden?
und ja, hier fehlt mir eben schon die idee wie ich den namen aufsplitten und in ein cell array speichern kann....


dann hab ich folgendes versucht:

Code:
varname = evalin('base','who');

cutname = regexprep(varname,'LeistungkW_*','') ;

cutname = regexprep(varname,'LeistungkW','')


auch ohne Erfolg...
LG Basti


edit by denny: bitte die Codeumgebung verwenden. Danke!
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 17.07.2013, 13:40     Titel:
  Antworten mit Zitat      
ohne die excel file is schwer. sind das mehrere excel files mit dem datum im namen oder wie läuft das?
am besten du lädst mal eine beispiel excel hoch
Private Nachricht senden Benutzer-Profile anzeigen
 
BastiM
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 31
Anmeldedatum: 15.07.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.07.2013, 13:51     Titel:
  Antworten mit Zitat      
So, das hier wäre mal eine beispielhafte Excel- Datei mit Messwerten...
Diese Datei würde ich dann einfach über den Import Button in den Workspace holen (nur die dritte Spalte, ergibt dann einen double- array)
der bekommt dann den passenden Namen, vielleicht nicht LeistungkW_20_06 sonder anders codiert...

und da ich nur ca. 15 Messwerte/ Messtage habe, wird es manuell nicht zu aufwendig das manuell zu importieren, ginge aber auch mit xlsread

im Endeffekt habe ich dann im Workspace 15 bis 20 double arrays mit den messwerten (Name_jeweiligesDatum), die dann noch verändert werden sollten u. wieder unter neuem namen_jeweiligesDatum abgelegt werden sollten...

Hilft das fürs Verständnis weiter?? Smile

LG Basti

TH31_1.xls
 Beschreibung:

Download
 Dateiname:  TH31_1.xls
 Dateigröße:  99.5 KB
 Heruntergeladen:  430 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 17.07.2013, 14:30     Titel:
  Antworten mit Zitat      
mein vorschlag wäre wie folgt
Code:
Files=dir('TH31*');
Data=cell(size(Files));
for l=1:size(Files,1)
[~,~,raw] = xlsread(Files(l).name);
Data{l}=nan(size(raw,1)-2,2);
for k=3:size(raw,1)
Data{l}(k-2,1)=datenum([raw{k,1},' ',raw{k,2}],'dd.mm.yyyy HH:MM:SS');
end
Data{l}(:,2)=cell2mat(raw(3:end,3));
end

so hast du alle deine daten ordentlich in einer cell
in der ersten spalte der matrix im jeweiligen cell eintrag findet man das datum. man kann da gerne auch wieder einen wert drauß machen mit
Code:
das finde ich persönlich besser zum bearbeiten. und da das eine matrix ist kannst du auch ohne probleme operationen auf die elemente anwenden zb
Code:
Data{1}(:,3)=Data{1}(:,2)*2;

vieleicht musst du deinen plot nochmal überarbeiten aber so kannst du meiner meinung nach viel einfacher mit den werten arbeiten. wenn du wirklich die variablen im dateinamen haben willst könnte man das über eine struct lösen oder über eval. finde aber beides nicht gut und von letzterem würde ich ganz besonders abraten da es das debuggen sehr schwer macht.
grüße winkow
Private Nachricht senden Benutzer-Profile anzeigen
 
BastiM
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 31
Anmeldedatum: 15.07.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.07.2013, 15:08     Titel:
  Antworten mit Zitat      
ok vielen Dank schon mal!
ich verstehe zwar ehrlich gesagt einige befehle noch nicht, muss mir das erst nochmal genau anschauen was hier gemacht wird:)!

aber ich denke auch es bringt mich schon ein stück näher!
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 17.07.2013, 15:09     Titel:
  Antworten mit Zitat      
ist eigentlich nicht so kompliziert. wenn fragen sind frag einfach.
Private Nachricht senden Benutzer-Profile anzeigen
 
BastiM
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 31
Anmeldedatum: 15.07.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.07.2013, 15:51     Titel:
  Antworten mit Zitat      
Danke fürs angebot, mach ich hiermit gleich... trau mich zwar gar nicht wenn du sagst dass es eigl. ganz einfach ist, aber hier mal in kommentierter weise das wo ich die anweisungen nicht verstehe...

Code:

Files=dir('TH31*');%% alle Dateien aus dem directory ordner werden in Files gespeichert
Data=cell(size(Files));%% ein cell array mit der Größe der Files(in dem Falle eins) und Namen "Data" wird erstellt"
for l=1:size(Files,1)%%laufindex l: von eins bis Ende des cell arays (size)
[~,~,raw] = xlsread(Files(l).name);%%so, hier Frage: was ist Files(1).name? Warum .name; das wird dann in eine 3x1 Matrix gespeichert? ~ heißt ja "nicht", also nicht, nicht,
Data{l}=nan(size(raw,1)-2,2);%% ?nan? not a number?
for k=3:size(raw,1)%%
Data{l}(k-2,1)=datenum([raw{k,1},' ',raw{k,2}],'dd.mm.yyyy HH:MM:SS');%% zweite schleife versteh ich gar nicht was die macht
end
Data{l}(:,2)=cell2mat(raw(3:end,3));%%diese funktion hatte ich mal versucht früher einzubauen....
end


 


LG Basti
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 17.07.2013, 15:58     Titel:
  Antworten mit Zitat      
Code:
[~,~,raw] = xlsread(Files(l).name);%%so, hier Frage: was ist Files(1).name? Warum .name; das wird dann in eine 3x1 Matrix gespeichert? ~ heißt ja "nicht", also nicht, nicht,

also die ~ sind dafür da um die rückgabe argumente von xlsread zu überspringen. in alten matlab versionen geht das nicht dann muss man die anlegen. sihe dazu in der doc von xlsread.
mit dem in files.name sind alle dateinamen gespeichert die bei dir gefunden wurden. mit files(l).name gehe ich jeden dateinamen durch und lade ihn.
Code:
Data{l}=nan(size(raw,1)-2,2);%% ?nan? not a number?

hier würd speicher reserviert. macht den code schneller würde aber auch ohne laufen. man sollte bei forschleifen aber vorher immer den speicher anlegen da sonst immer eine kopie vom alten vektor gemacht werden muss wenn ein neues element angehangen wird.
Code:
for k=3:size(raw,1)%%
Data{l}(k-2,1)=datenum([raw{k,1},' ',raw{k,2}],'dd.mm.yyyy HH:MM:SS');%% zweite schleife versteh ich gar nicht was die macht
end

in deinem excel file liegen die daten als string vor. ich wande hier das ganze nur in ein für matlab gutes format um. jetzt kann man damit zb auch rechnen etc. der erste teil setzt den zu interpretierenden string zusammen und der 2. teil sagt ihm wie er es interpretieren soll. halt tage monate jahre stunden minuten sekunden.
Private Nachricht senden Benutzer-Profile anzeigen
 
BastiM
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 31
Anmeldedatum: 15.07.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.07.2013, 16:34     Titel:
  Antworten mit Zitat      
ok...
also mit den ' ' weise ich auf einen Textstring hin? oder ist das ein platzhalter?
datenum: konvertiert datum u. uhrzeit in eine zahl, und über den befehl raw{k,2} respektive raw{k,2} sagst Du ihm in welcher reihe die datumswerte zu suchen sind...? ' ' wäre dann sowas wie vereinige beide excel- spalten zu einer zahl?
was sagt raw aus? ist das eine variable oder ein matlab- reservierter befehl (finde ihn momentan nicht)

auch den befehl [~,~,raw]

was bedeutet z.b. Data{|} (k-2,1) ?
ich kann zwar das programm laufen lassen, aber ich verstehe gerade weder warum hier k = 3 als indexbeginn gesetzt ist

ich denke das sind fundamentale probleme, wenn man die mal verstanden hat tut man sich ein bisschen leichter... denn ich wär nie im leben auf diesen code gekommen....
vielleicht mal auch n tipp wie man sowas "denktechnisch" aufbaut um in die matlab logik reinzukommen...
bin leider hier an meiner abschlussarbeit, wo mir sonst keiner helfen kann...

Vielen Dank schon mal!
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 17.07.2013, 16:43     Titel:
  Antworten mit Zitat      
raw ist ein variablen name den ich aus der doc übernommen habe. ich fange bei k=3 an weil in zeile 3 deiner excel die daten beginnen. die ' ' in
Code:
[raw{k,1},' ',raw{k,2}]
bauen ein lehrzeichen zwischen beiden strings ein. bin mir nicht sicher ob das überhaupt nötig ist aber ich habs da mal gemacht.
Code:
ist halt '28.06.2013' und
Code:
die uhrzeit.
Code:
Data{l} (k-2,1)
der erste index l ist für die cell. da giebts so viele wie du dateien hast. der 2. teil (k-2,1) spricht die matrix in der cell an. k-2 weil k ja bei 3 losgeht ich aber ja bei 1 in der neuen matrix anfangen will.
man hätte auch eine 3d matrix nehmen können anstadt eine cell.
Code:
ist kein befehl.
normal hat xlsread 3 rückgabe werte. einer ist der text einer sind die zahlen und der 3. ist beides. raw ist hier also beides. die anderen beiden interessieren mich hier grade nicht darum lasse ich sie mit ~ aus
Private Nachricht senden Benutzer-Profile anzeigen
 
BastiM
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 31
Anmeldedatum: 15.07.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.07.2013, 08:36     Titel:
  Antworten mit Zitat      
guten morgen!!!

hab nochmal über dem ganzen geschlafen, und mir als weiteres folgendes überlegt....
code stimmt von der schreibweise noch nicht, aber könntest DU mal drüber schauen ob der Ansatz generell Sinn macht...

Code:

%%dein Code

Files=dir('TH 31*');
Data=cell(size(Files));
for l=1:size(Files,1)
[~,~ ,raw] = xlsread(Files(l).name);
Data{l}=nan(size(raw,1)-2,2);
for k=3:size(raw,1)
Data{l}(k-2,1)=datenum([raw{k,1},' ',raw{k,2}],'dd.mm.yyyy HH:MM:SS');
end
Data{l}(:,2)=cell2mat(raw(3:end,3));
end

%%meine idee, ich würde die cell- Variable "raw" heranziehen, da hier schon alle werte drinnen stehen die ich brauche...

for i=3:1:size(raw)%%fange ab zeile 3 an zu zählen
   
    if raw(i-1,1)=raw(i,1)%%falls zwei datum-zellen hintereinander gleich sindvon der ersten spalte der raw- cell
        energy = raw(i,3)*0,12; %% hier soll ein neuer vektor erstellt werden, der jeden ursprungswert mit faktor multipliziert erhält
        'Energie_raw (i-1,1)' =sum(energy)%%hier soll er das Datum aus raw (i,1) nehmen und in den Namen integrieren, k.a. wie das richtig geschrieben wird; pro datum steht dann ein Wert- die summe aus dem energy- array
    else
        energy = raw(i,3)*0,12;%% nicht sicher ob die if- else beziehung so eindeutig wäre, ich dachte
        'Energie_raw(i,1)'=raw(i,3)*0,12
end

 


Ich bedanke mich schon mal für den Post gestern und die Geduld!

LG Basti
Private Nachricht senden Benutzer-Profile anzeigen
 
BastiM
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 31
Anmeldedatum: 15.07.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.07.2013, 08:39     Titel:
  Antworten mit Zitat      
ok, der energy vektor ist schon mal auf jeden Fall falsch angeschrieben...

müsste wohl heißen:

energy (i,Smile = energy = raw(i,3)*0,12;

oder?
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 18.07.2013, 09:24     Titel:
  Antworten mit Zitat      
ok meine anmerkung dazu:
Zitat:
Code:
'Energie_raw(i,1)'=raw(i,3)*0,12
geht nicht
Code:
'Energie_raw(i,1)'
ist ein string. dem kann man kein wert zuweisen.

Zitat:
Code:
if raw(i-1,1)=raw(i,1)
geht meiner meineung nach auch nicht. da auch raw strings enthällt und diese mit strcmp verglichen werden müssen. das ist einer der gründe für meiner vorherige umwandlung mit datenum.
weiterhin solltest du dir mal
Code:
angucken. ich denke damit kann man deine 2. schleife ersetzen.
und vieleicht guckst du dir doch nochmal mein datumsformat und seine vorteile an.
wenn du die daten mit
Code:
abrundest stehen gleiche zahlen für den selben tag. dann noch
Code:
und ein wenig gebastell und die 2. schleife lässt sich beschleunigen oder ganz wegmachen da bin ich mir noch nicht ganz sicher.
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2, 3  Weiter

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.