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

wie kann ich eine mat file laden???

 

Edwin
Forum-Anfänger

Forum-Anfänger


Beiträge: 31
Anmeldedatum: 27.09.10
Wohnort: Charleston, SC
Version: 2009b
     Beitrag Verfasst am: 28.09.2010, 16:08     Titel:
  Antworten mit Zitat      
Hallo,

bin ein Neuling mit Matlab. Mein Problem ist aehnlich bzw. gleich wie schon hier beschrieben.
Jedoch noch ein wenig umfangreicher...

Mit meinem Bruchstueck von einem Programm bin ich schon in der Lage Variablen einzeln aus einem .mat-File zu laden. Jedoch muss ich dazu jede Datei einzeln anklicken und jede Variable einzeln beschreiben.

Mein Ziel ist es diesen Vorgang zu automatisieren und dynamisch an den Inhalt der Ordner anzupassen.

Dabei sind meine Messdaten wie folgt gespeichert
C:\...Desktop\Messdaten\Data\0001\9.mat
...
C:\...Desktop\Messdaten\Data\0056\9.mat

Dabei wuerde ich gern den Pfad bis zum Ordner 'Data' von Hand auswaehlen und den Rest MATLAB machen lassen.
Dabei soll mein Programm nacheinander die Ordner abarbeiten. Zunaechst in den Ordner 0001 und die Datei 9.mat laden. Aus dieser Datei alle vorhandenen Variablen in den Workspace laden und mein XY-Algorithmus(noch in Arbeit) durchlaufen -> speichern und dann aus dem Ordner 0002 die Datei 9.mat laden...Wiederholung wie bei 0001

Code:

%%
[FileName,PathName] = uigetfile('*.mat','Load mat-File');


inhalt_mat=load('9.mat'); % Laden der mat-File
sys2=inhalt_mat.sys2; %  sys2 aus struct inhalt_mat in die Variable sys2 schreiben
 
Private Nachricht senden Benutzer-Profile anzeigen


denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 04.10.2010, 14:27     Titel:
  Antworten mit Zitat      
Hallo

nur ein paar Tipps:
1) in deinem Fall statt UIGETFILE UIGETDIR verwenden, damit kannst den Ordner bis der Stelle
C:\...Desktop\Messdaten\Data\
2) Danach mit DIR arbeiten
3) Noch währen hilfreich FULLFILE

Lese erstmal Hilfe zu Befehlen, probiere selbst und wenn nicht klappt hier wieder fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Edwin
Forum-Anfänger

Forum-Anfänger


Beiträge: 31
Anmeldedatum: 27.09.10
Wohnort: Charleston, SC
Version: 2009b
     Beitrag Verfasst am: 04.10.2010, 20:08     Titel:
  Antworten mit Zitat      
Hallo,

vielen Dank fuer die Tipps.

Das Laden der Daten funktioniert soweit. D.h. im workspace werden alle Variablen angezeigt und ich kann diese verwenden.
Da ich eine Matrix aus allen Variablen des Workspace machen moechte, suche ich nun noch nach einer Loesung. Die Loesung in dem ich jede Variable einzeln eintippe geht zwar, aber ich moechte das dies MATLAB uebernimmt.

Das ist diese einzeln-eintip-Loesung:

D=[hz1; hz2; vl; vr; hl;...];




Im Workspace befindet sich q_KEY, welche alle Variablennamen beinhaltet.

q_KEY =( hz1 hz2 vl vr hl ...)

Ich habe es schon versucht ueber length(q_KEY) und einzelnes ansprechen von q_KEY die Variablen zu speichern, aber das Problem ist, dass darin jeder Buchstabe einzeln angesprochen werden muss.

Ich moechte das MATLAB q_KEY(1,1) = hz1 herausgibt, aber MATLAB spuckt mir q_KEY(1,1) = h heraus.



Weis jemand weiter?

Danke!

Edwin
Private Nachricht senden Benutzer-Profile anzeigen
 
michai
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 83
Anmeldedatum: 22.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.10.2010, 06:54     Titel:
  Antworten mit Zitat      
Hi!

Also das sind ja quasi zwei Fragen in einer.

Als erstes mal zu deinem q_Key:

Am besten legst du dir ein Variable q_Key vom Datentyp "cell" an. Das sieht dann so aus:

Code:

q_Key = {'hz1', 'hz2', 'vl', 'vr', 'hl' ... };
 


Dann bekommst du folgendes:

Code:

>> qKey{1}

ans =
         hz1
 




Für deinen zweiten Fragenteil:

Du könntest dir z.B. eine for-Schleife zu Hilfe nehmen und die in der Hilfe mal die Funktion eval() ansehen. Damit sollte dein Problem zu lösen sein. Wink

Schöne Grüße
Micha
Private Nachricht senden Benutzer-Profile anzeigen
 
Edwin
Forum-Anfänger

Forum-Anfänger


Beiträge: 31
Anmeldedatum: 27.09.10
Wohnort: Charleston, SC
Version: 2009b
     Beitrag Verfasst am: 05.10.2010, 15:11     Titel:
  Antworten mit Zitat      
Hi Micha,

danke fuer die Antwort. Aber diese cell muss ich ja ebenfalls wieder von Hand eingeben, oder verstehe ich das grad falsch?


Edwin
Private Nachricht senden Benutzer-Profile anzeigen
 
michai
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 83
Anmeldedatum: 22.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.10.2010, 07:27     Titel:
  Antworten mit Zitat      
Naja, nicht unbedingt. Ich gehe jetzt mal davon aus, dass deine Variablen so heißen, wenn du sie aus den .mat-Files lädst, richtig?

Und das Laden machst du ja per

Code:

inhalt_mat = load(...)
 


Die Variable inhalt_mat ist eine Struktur und inhalt_mat.hz1 ist deine Zielvariable. Mit Hilfe von

Code:

q_Key = '' % NUR BEIM ERSTEN MAL!!!
q_Key = [q_Key fieldnames(inhalt_mat)'];     % Achtung! fieldnames() ist transponiert mit  ' (Hochomma)
 


kannst du die Variablennamen extrahieren und in q_Key als cell speichern bzw. daran anhängen.



Aber du könntest dir diesen Zwischenschritt auch sparen:
Code:

D = {} % NUR BEIM ERSTEN MAL!

inhalt_mat = load(...);
D = [D struct2cell(inhalt_mat)'];
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Edwin
Forum-Anfänger

Forum-Anfänger


Beiträge: 31
Anmeldedatum: 27.09.10
Wohnort: Charleston, SC
Version: 2009b
     Beitrag Verfasst am: 06.10.2010, 13:10     Titel:
  Antworten mit Zitat      
cool, genau so etwas habe ich gesucht! Herzlichen Dank!!

Die Variablen die Ich verarbeite lade ich aus dem .mat-File. Dabei entsteht beim Laden diese 'q_KEY'-Variable, welche die Namen der Variablen beinhaltet.

Code:

q_KEY =hz1 hz2 vl vr hl hr sys1 sys2 peav1 peav2 sek1 sek2 spk1 spk2 spk_hub_1 spk_hub_2 i_motor motor_drehzahl
 


Da ich die Namen spaeter zur Indizierung der neuen Variablen nutzen moechte, waere es nicht schlecht wenn ich auch die Namen wie die Werte anprechen koennte.

Also wie
Code:
D{6}=[3;5;6;8;...]
moechte ich dann mit
Code:
auslesen.
Mit
Code:
D{6}(11:13)
kann ich zwar die Buchstaben auslesen, jedoch muss ich dabei vorher wissen wo die Bezeichnung beginnt und endet.

Dabei waere ich wieder ein mal bei der manuellen Eingabe. Ich denk das dies aber ebenfalls automatisiert machen kann, ich wei= nur nicht wie?


Danke!

Edwin
Private Nachricht senden Benutzer-Profile anzeigen
 
michai
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 83
Anmeldedatum: 22.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.10.2010, 13:26     Titel:
  Antworten mit Zitat      
*kopfkratz*
Öhhh... Was hast du vor? Ich versteh's grad nicht.
Private Nachricht senden Benutzer-Profile anzeigen
 
Edwin
Forum-Anfänger

Forum-Anfänger


Beiträge: 31
Anmeldedatum: 27.09.10
Wohnort: Charleston, SC
Version: 2009b
     Beitrag Verfasst am: 06.10.2010, 14:37     Titel:
  Antworten mit Zitat      
oh sorry,

ich versuchs ein wenig allgemeiner zu halten.

Also es befinden sich im workspace Variablen (hz1, hz2, vl, vr, hl, hr, sys1, sys2, ...). Diese werden mit meinem xy-Script-file bearbeitet. (dabei wird der Inhalt der variable untersucht und aufgetrennt). Waehrend einer Schleife moechte ich meine neuen Daten unter dem alten Namen speicher jedoch mit dem Zusatz in welcher Schleife diese erzeugt wurde.

bsp.

vl wird geladen, verarbeitet und nun als vl_1 gespeichert, Schleife 2 -> Variable wird als vl_2 gespeichert...

Um das zu realisieren bin ich der Meinung, dass ich die Variablennamen einzeln ansprechen muss um diese weiter zu verwenden.

Ich hoffe es ist nun ein wenig verstaendlicher.


Edwin
Private Nachricht senden Benutzer-Profile anzeigen
 
michai
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 83
Anmeldedatum: 22.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.10.2010, 14:55     Titel:
  Antworten mit Zitat      
Also so ganz hab ich das immer noch nicht kapiert. Vielleicht schreibst du mal ein wenig Code, so wie du es machen würdest. Dann kann man immernoch gucken, was man verbessern kann.

Ich versuchs trotzdem mal. Ich hoffe, ich liege richtig. Wink

Also zum einen kannst du die mal die Funktion eval() angucken. z.B.:

Code:

for i=1:10
   x = a+b % berechnung hier
   eval(['vl_' num2str(i) ' = x']); % Ist das gleiche wie beim ersten mal vl_1 = x, beim 2. Mal vl_2 = x usw.
end
 


Oder du legst deine Ergebnisse in eine Struktur. Deren Felder kann man auch dynamisch ansprechen:


Code:

for i = 1:10
   x = a + b; % Berechnung hier
   result.(['vl_' num2str(i)]) = x;  % ist das gleiche wie result.vl_1 = x, result.vl_2 = x usw.
end
 


Ist es das, was du suchst?
Private Nachricht senden Benutzer-Profile anzeigen
 
Edwin
Forum-Anfänger

Forum-Anfänger


Beiträge: 31
Anmeldedatum: 27.09.10
Wohnort: Charleston, SC
Version: 2009b
     Beitrag Verfasst am: 06.10.2010, 15:50     Titel:
  Antworten mit Zitat      
danke fuer deine Zeit und Muehe. Ich lad mal den code hoch:

Hier lade ich meine Daten (funktiniert so weit ganz gut)

Code:

%% Import the raw-data from file...
inputPath = uigetdir();  % search file
cd(inputPath);           % input path of file
dir_str=dir('*.mat');    % show me the variables from file 9.mat in workspace
%file_names = {dir_str.name};
load 9.mat              % load *.mat-file, which created with UNIVW

D = {};                         % create cell

variables_mat = load('9.mat');  % load *.mat-file, which created with UNIVW

VARs = [D struct2cell(variables_mat)']; % create a Variable-Index-Matrix
VARs(1:6)=[] ;                          % delete not needed Variables  
number_of_VARs=numel(VARs) ;            % get number of Variables
 


Hier bekomme ich die Laenge einer Variable und die Anzahl der Variablen die ich benoetige.
Code:

%%
columns=length(VARs{8})
rows=numel(VARs)
 


Hier nun die Schleife, welche sich in einer weiteren Schelife befindet.

Code:


     for w=1:number_of_VARs
          %% use 'iop' to cut all other data variables at the same
          %% row
          eval(['q_KEY{c}_' num2str(m)  '=VARs{c}(1:iop);' ])
          %% delete the previous saved data from the rest of the not
          %% examined data
          VARs{c}(:,1:iop) = []
          c=c+1;
     end
               
          m=m+1;
                   
 




Ich moechte das gleiche wie bei VARs{c}(in dem ich damit die Werte der einzelnen Variablen abrufe) nun mit q_KEY{c} haben. Damit moechte ich die einzelnen Namen der Variablen abrufen.

in dieser oben aufgefuehrten Schleife soll nun folgendes erzeugt werden:

vl_1
hl_1
vr_1...

dann wird m erhoeht, das Programm xy lauft erneut und landet nun wieder in dieser ^^ Schleife und speichert nun die Werte als:

vl_2
hl_2
vr_2...

m=m+1 -> Programm xy ->

vl_3
hl_3
vr_3...

Hierbei sollen die Namen vl, hl, vr,... ausgelesen werden, eben ueber q_KEY{c}




Edwin
Private Nachricht senden Benutzer-Profile anzeigen
 
Edwin
Forum-Anfänger

Forum-Anfänger


Beiträge: 31
Anmeldedatum: 27.09.10
Wohnort: Charleston, SC
Version: 2009b
     Beitrag Verfasst am: 07.10.2010, 14:56     Titel:
  Antworten mit Zitat      
Hallo,

also ich hab mir jetzt etwas zusammengeschustert. Ein Problem besteht aber immer noch.

In der Variable Fkt_ speichere ich den Variablennamen aus q_KEY
Code:

Fkt_=q_KEY(beginn:ende);
 


D.h. in Schleifendurchgang Nummer 1 ist in
Code:
gespeichert.

Nun moechte ich mit dem folgenden Befehl die Werte dieser Variable zuweisen.

Code:

eval(['Fkt_' num2str(m)  '=VARs{c}(1:iop);' ])
 


Dieser Befehl macht genau das was ich moechte - das Problem liegt nur darin, dass er Fkt_ als Variablenname nimmt ansatt hz1.
Also als Ergebnis bekomme ich
Code:

Also wie kann ich nun im eval-Befehl meine Variable hz1 aus Fkt_ auslesen lassen? sodass ich als Ausgabe folgendes bekomme
Code:



Danke!

Edwin
Private Nachricht senden Benutzer-Profile anzeigen
 
michai
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 83
Anmeldedatum: 22.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.10.2010, 15:00     Titel:
  Antworten mit Zitat      
Naja, das ist einfach: Wink

Code:

eval([Fkt_ num2str(m)  '=VARs{c}(1:iop);' ])
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Edwin
Forum-Anfänger

Forum-Anfänger


Beiträge: 31
Anmeldedatum: 27.09.10
Wohnort: Charleston, SC
Version: 2009b
     Beitrag Verfasst am: 07.10.2010, 16:02     Titel:
  Antworten mit Zitat      
herzlichen Dank fuer die schnelle Antworten!

Ach, na sowas Very Happy nur die Hochkommata...vielen Dank!

Bloederweise bin ich ebenfalls davon ausgegangen das der Unterstrich von Fkt_ uebernommen wird. Macht MATLAB natuerlich nicht, ist ja so als Variable gepeichert.

Der besseren Uebersicht halber wuerde ich halt doch gern hz1_1 erhalten.
Das muesste ich ja hier schon deklarieren:
Code:

Fkt=q_KEY(1:(beginn-1))
 


Nun komme ich auch nicht darauf. Hast du so ein Befehl ebenfalls parat?


Edwin
Private Nachricht senden Benutzer-Profile anzeigen
 
michai
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 83
Anmeldedatum: 22.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.10.2010, 06:56     Titel:
  Antworten mit Zitat      
Eieiei, ich habe das Gefühl ich muss hier erstmal ein paar grundsätzliche Zusammenhänge erklären:

Code:

eval([Fkt '_' num2str(m)  ' = VARs{c}(1:iop);'])  % die Lösung
 


Also: Was passiert hier?

Die Eval()-Funktion erwartet eine String (Zeichenkette), die einem Befehl entspricht, wie man ihn z.B. auf der Kommandozeile eingeben würde. Die beiden folgenden Zeilen sind also identisch

Code:

>> a = 5
>> % enspricht
>> befehl = 'a = 5';
>> eval(befehl);
 


Um jetzt eine Dynamik da rein zu bringen wie du sie benötigst müssen wir uns den String also entsprechend zusammenbauen. Dazu nutzen wir die Möglichkeit der Verkettung. (Es gäbe noch zig andere Wege z.B. mittels strcat() oder sprintf(), aber hier passt die Verkettung schon.) So kann man Textteile zusammenfügen.
Manche dieser Textteile sollen ja nun dynamisch sein, müssen also durch Variablen ersetzt werden.

Code:

befehl = 'hz1_1 = VARs{c}(1:iop);' ; % da wollen wir hin.

befehl = ['hz1' '_' '1' ' = VARs{c}(1:iop);']; % ist das gleiche, nur schonmal zerlegt. 'hz1' und '1' sollen dynamisch werden.

fkt = 'hz1';
loop_num = 1;
loop = num2str(loop_num);
befehl = [fkt '_' loop ' = VARs{c}(1:iop);']; % wieder das gleiche, diesmal die dynamischen Teile durch Variablen ersetzt
 


So kannst du dir beliebige Befehle in einer Zeichenkette zusammenbasteln, die dann mit eval() wie ein eingetippter Befehl ausgeführt werden.

Zum Üben, und damit man beim Denken nicht so einen Knick im Kopf bekommt, macht es vielleicht Sinn, das Erstellen des Befehls und den Aufruf von eval() zu trennen und in zwei Schritten auszuführen.

Code:

cmd = [Fkt '_' num2str(m) ' = VARs{c}(1:iop);'];
eval(cmd);
 



Schöne Grüße Wink
Micha
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite Zurück  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.