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

Excel Datei einlesen

 

MJR10
Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 12.12.11
Wohnort: ---
Version: R2010b
     Beitrag Verfasst am: 12.12.2011, 16:38     Titel: Excel Datei einlesen
  Antworten mit Zitat      
Hallo,
ich bin gerade dabei mich in Matlab einzuarbeiten. leider komm ich recht langsam voran da ich vorher noch nie richtig programmiert habe.
Ich habe foglendes Problem, dass ich mehrere Versuchsreihen in einer Excel Datei habe.
In einem Versuch werden über eine bestimmte Zeit 18 verschiedene Messwerte aufgezeichnet, so dass ich dann für jede Messgröße 3000 Werte habe. Die Variablennamen stehen in den Zellen B2 bis S1. "rechts" danaben in den Spalten beginnt dann die zweite Messreihe wieder mit den 18 Messgrößen (T1 bis AK1) und so weiter, insgesamt geht das Spiel 13 mal so weiter bis Spalte IA erreicht ist.
Die gemessenen Werte fangen jetzt dummerweise nicht in der zweiten Zeile an sondern erst in der 25. Zeile.
Jetzt möchte ich jede Messreihe einzeln abspeicher können. So dass ich dann auf die Werte der 1. Messreihe zugreifen kann und getrennt jede Messgröße plotten lassen kann.
Das ganze sollte dann denk ich mal in einem cell array gespeichert werden, so dass sich folgende Struktur ergeben sollte
Messreihe_1. Messgroesse_1
Messreihe_1. Messgroesse_2
.
.
.
Messreihe_1. Messgroesse_18

Messreihe_2. Messgroesse_1
Messreihe_2. Messgroesse_2
.
.
.
Messreihe_2. Messgroesse_18


leider komm ich nicht so recht über #
[nums, txt] = xlsread('import3.xls', 'B1:S1')
hinaus. Wenn ich jetzt
[nums, data] = xlsread('import3.xls', 'B24:S3000')
schreibe setzt er mir dass im Cell Aray dann rechts daneben?´Ich versteh noch nicht so genau was dieses Cell Array macht und wie es aufgebaut wird. Ich glaubs zwar immer mal wieder zu verstehen doch dann les ich wieder wo was das micht total durcheinander bringt.
was ist eigentlich der Unterschied zwischen structures und cell arrays? ist das das gleiche oder ist da doch ein unterschied?
Ich hoffe doch dass mir noch zu helfen ist und ich nicht gleich abgeschrieben werde.

Im Anhang ist ein kleines Bild so wie die Messdaten prinzipiel aufgebaut sind.

Unbenanntes Bild.png
 Beschreibung:

Download
 Dateiname:  Unbenanntes Bild.png
 Dateigröße:  7.72 KB
 Heruntergeladen:  1195 mal
Private Nachricht senden Benutzer-Profile anzeigen


MJR10
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 12.12.11
Wohnort: ---
Version: R2010b
     Beitrag Verfasst am: 14.12.2011, 15:22     Titel:
  Antworten mit Zitat      
Hallo,
ich habs jetzt soweit schon mal ein bisschen hinbekommen.
Aber noch ist es nicht das was ich eigentlich will.
Hier mal was ich bisher hab:
Code:
[nums, txt] = xlsread('import3.xls');


% For Schleife um alle Variablen einer Messreihe(Spalten in der Excel Tabelle) automatisch zu durchlaufen
        for n = 2:19;

           % Hier werden die verschiedenen Variablennamen anhand de Spaltenüberschrift der Excel-Tabelle erstellt.
           % var_1 = n_1 , var_2 = n_2, var_3 = p_1, var_4 = p_2 usw.
           eval(['var_' num2str(n-1) ' = txt(1,n);']);  
         
           % Hier werden die Matrizen der einzelnen Messdaten erstellt.            
           eval(['daten_' num2str(n-1) ' = nums(21:40,n);']);        
       
           % Funktioniert zwar, aber schreibt noch nicht den Variablennamen
           % in das Feld vom struct - sondern nur var_1, var_2 ....
           eval(['messreihe1.var_', int2str(n-1), '= daten_', num2str(n-1) ]);                              
 
        end;


jetzt möchte ich eigentlich dass er mir für jeden Messkanal in den Feldnamen des Structs auch den richtigen Namen schreibt, quasi die Überschrift der Spalte in der Excel Datei. Ich bekomms nur so hin dass die Feldnamen im Struct bei var_1 anfangen und bei var_18 aufhören. Vielleicht gibts ja da eine kleine Hilfestellung wie man das umsetzen könnte.
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: 14.12.2011, 15:54     Titel:
  Antworten mit Zitat      
Hallo MJR10,

Wie kommt es eigentlich, dass so viele Matlab-Anfänger ausgerechnet auf EVAL kommen? Die Methode Variablen-Namen während des Programm-Laufs dynamisch zu erzeugen ist sehr fehleranfällig und bremst Matlab heftig aus.

Statt "daten_1" zu erzeugen, wäre es deutlich effizienter und leichter zu debuggen, wenn Du "daten{1}" benutzt. Dann kann man später sehr einfach in einer Schleife darauf zugreifen.

Bei der Zuweisung eines Struct-Feldes ist EVAL auch eher hinderlich, weil das prima mit "dynamic fieldnames" funktioniert:
Code:
messreihe1.(sprintf('var_%d', n-1)), = daten{n-1};

Mehr über EVAL und auch gleich ASSIGNIN findest Du in ein paar Hundert meiner Posts in diesem Forum ;-)

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 12.12.11
Wohnort: ---
Version: R2010b
     Beitrag Verfasst am: 15.12.2011, 09:38     Titel:
  Antworten mit Zitat      
Also das mit eval ist ganz schnell erklärt. Ich hab einfach bei Google gesucht wie ich in Matlab schleifen erzeuge. Wink

Mh das mit "daten{1}" versteh ich noch nicht so recht. Wo soll ich das genau verweden?

auch das mit den "dynamic fieldnames" hab ich noch nicht so recht verstanden. Sorry ich hab zwar versucht mich darüber schlau zu machen, aber so recht bin ich da leider nicht weiter gekommen. Sad
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: 15.12.2011, 12:17     Titel:
  Antworten mit Zitat      
Hallo MJR10,

"daten{1}" wird in den getting Started-Kapiteln der Dokumentations ausführlich erklärt, Stichwort "CELL". Eine so mächtige Sprache wie Matlab benötigt einfach ein ausführliches Studium der Dokumentation.

"Dynamic fieldnames":
Code:
Str = 'NameOfTheField';
S.(Str) = 'Contents';
disp(S.(Str));

Wenn man den Feld-Namen also in runden Klammern angibt, wird er während der Laufzeit eingesetzt. Ist ähnlich wie die SETFIELD und GETFIELD-Befehle, aber effizienter.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 12.12.11
Wohnort: ---
Version: R2010b
     Beitrag Verfasst am: 15.12.2011, 13:47     Titel:
  Antworten mit Zitat      
Hallo,
mh jetzt hätte ich zwei Fragen. Zum einen wäre es Möglich den Ersten Feldnamen schon durch zu nummerieren also z.B. messreihe##.Variable1 wobei die ## oder muss ich mich da auf messreihe.## beschränken.
Und zum anderen warum funktioniert das bei mir nicht:
Code:

[werte, kanal] = xlsread('import3.xls');
% überflüssige Zeilen löschen
kanal(2:end , : ) = [];
% überflüssige 1. Spalte löschen
kanal(:, 1 ) = [];
% Überflüssige Zeilen löschen
werte(1:20 , : ) = [];
% überflüssige 1. Spalte löschen
werte(:, 1 ) = [];

% Ermitteln der Anzahl der Kanalreihen
anzahl_kanal = size(kanal, 2);
% Berechnen der Messreihen. Jede Messreihe besitzt 18 Kanäle
anzahl_messreihe = anzahl_kanal/18;
   

% Sicherung des Kanal Arrays
kanal_backup = kanal;



% Löschen der einzelnen Kanäle bis alle Messreihen durchlaufen sind
for n = 1:5
    str = num2str(werte(1,17),2);
    name1 = 'w';
    name = char([name1 str]);
    messreihe.(name) = 100;


    % Löschen der vordersten Messreihe
    kanal(:, 1:18 ) = [];
   
end;  

 

werte(1,17) ist dabei eine Zahl die ich runden möchte. Meißt -49.9992, -39.9991 usw. Später werden die Zahlen positiv.
Als Fehlermeldung kommt:
??? Invalid field name: 'w-60'.

Error in ==> Test07 at 26
messreihe.(name) = 100;

zuerst hab ich mir ja gedacht der Feldname müsse mit einem Buchstaben beginnen deshalb das w vorn dran, aber das hilft leider auch nichts. auch die Umwandlung in char bringt nichts.
Private Nachricht senden Benutzer-Profile anzeigen
 
MJR10
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 12.12.11
Wohnort: ---
Version: R2010b
     Beitrag Verfasst am: 15.12.2011, 14:08     Titel:
  Antworten mit Zitat      
ich hab jetzt schon mal rausgefunden dass wenn ich den Wert positiv machen also er nicht 'w-60' sondern er 'w60' einsetzt es funktioniert. Kann ich das aber auch irgendwie umgehen, da ich schon gerne im namen kennzeichnen würde dass es sowohl positive als auch negative Werte gibt.
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: 15.12.2011, 15:31     Titel:
  Antworten mit Zitat      
Hallo MJR10,

Ich rate Dir unter allen umständen Namen wie "w60" zu vermeiden. Der Name einer Variable sollte keine Information über den Wert des Inhaltes tragen. Genauso ist der Name auch kein geeigneter Ort für einen Index.
Beides macht einen späteren Zugriff auf die Variablen deutlich komplizierter und dies provoziert Fehler.

In einem Programm kann man viel leichter mit Werten arbeiten, um später z.B. nach all negativen Einträgen zu suchen. Wenn man stattdessen nach Minuszeichen in den Variablennamen suchen muss, ist das sehr unpraktisch.

Ntürlich hat es schon ein paar Vorteile, magische Zusatz-Informationen in einen Namen hineinzupacken. So wäre es z.B. manchmal hilfreich, wenn mein Vorname gleich meine Sozialversicherungsnummer und die BLZ meiner Bank enthielte. Dann könnte ich die nicht mehr vergessen und die Krankenkasse müsste nicht extra nachfragen. Aber meine Unterschrift unter dieser Mitteilung wäre doch unpraktischer:

Gruß, JanSF34099-1101992876-67224530
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.