Verfasst am: 17.07.2013, 13:06
Titel: Messwerte verschiedener Tage bearbeiten
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...
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
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
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....
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...
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
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
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!
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
[~,~,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.
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...
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.
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
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
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
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
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
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.