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

Einlese-Funktion von .mat-Files/Vektoren auf Structs umcoden

 

Shin
Forum-Century

Forum-Century


Beiträge: 117
Anmeldedatum: 12.11.09
Wohnort: Karlsruhe
Version: ---
     Beitrag Verfasst am: 23.06.2010, 11:01     Titel: Einlese-Funktion von .mat-Files/Vektoren auf Structs umcoden
  Antworten mit Zitat      
Hallo Leute.
Habe jetzt gerade mein (zumindest für mich) recht umfassendes GUI zum Einlesen von Daten und deren Plotten+Bearbeiten fertig geschrieben.

Mithilfe von
Code:
function loadselected(fname)
if nargin==0
   [fname pname] = uigetfile('*.mat','select MAT-file');
   if ~pname ; return ; end
   s = fname;
   fname = fullfile(pname,fname);
end% if
var = whos('-file',fname);
[sel,ok] = listdlg('PromptString','Select a file:','ListString',{var.name});
if ok
   evalin('caller',sprintf('load %s %s',fname,sprintf('%s ',var(sel).name)))
   t = sprintf('%s ',var(sel).name);

end% if
assignin('base', 'p1',t);
assignin('base', 'p2',s);

kann man mit meinem Progrämmchen .mat Files aussuchen und darin enthaltene Variablen auswählen - nur eben keine structs. Hat jemand einen Anreiz oder eine Idee wie ich das einbauen könnte? Oder eventuell eine Alternative?

Was es können sollte:
Auf Knopfdruck ein listdlg - notfalls eine Listbox öffnen, die es ermöglicht mat files und structs zu durchstöbern und dann Variablen (Vektoren bzw. Matrizen) auszuwählen.

Gruß und herzlichen Dank für's Durchlesen und eventuelle Hilfe!

Chris

edit/update:

Ich habe jetzt mit
Code:
geprüft, ob die ausgewählte Variable eine Struktur ist oder nicht - wenn ja, öffnet sich ein neuer listdlg - nun am rumprobieren, wie ich den Inhalt der Struct da reinbekomme.
Private Nachricht senden Benutzer-Profile anzeigen


Shin
Themenstarter

Forum-Century

Forum-Century


Beiträge: 117
Anmeldedatum: 12.11.09
Wohnort: Karlsruhe
Version: ---
     Beitrag Verfasst am: 29.06.2010, 15:34     Titel:
  Antworten mit Zitat      
Push.

Jemand ein Vorschlag, wie ich in eine Listdlg den Inhalt einer struct anzeigen kann?
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 29.06.2010, 16:23     Titel:
  Antworten mit Zitat      
Hallo

du willst wohl gleich ein bestimmtes Feld aus Struct rausholen?
dazu muss du dann aber das File vorher laden und dann Struct Felder in ListDlg ablegen.

Also es ist ein Stück komplexer, als jetzige deine Funktion.
1) Du brauchst nicht unbedingt ISSTRUCT, WHOS macht es bereits
2) FIELDNAMES, um auf Felder der Struktur zu zugreifen
3) LISTDLG um Felder anzuzeigen
4) EVALIN um zu zuweisen an deiner Variable
Code:

function loadselected(fname)
if nargin==0
   [fname pname] = uigetfile('*.mat','select MAT-file');
   if ~pname ; return ; end
   s = fname;
   fname = fullfile(pname,fname);
end% if
var = whos('-file',fname);
[sel,ok] = listdlg('PromptString','Select a file:','ListString',{var.name});
if ok
  if ~strcmpi(var(sel).class,'struct')
    evalin('caller',sprintf('load %s %s',fname,sprintf('%s ',var(sel).name)))
    t = sprintf('%s ',var(sel).name);
    assignin('base', 'p1',t);
    assignin('base', 'p2',s);
  else
    evalin('caller',sprintf('load %s %s',fname,sprintf('%s ',var(sel).name)))
    fnames = evalin('caller', sprintf('fieldnames(%s);',var(sel).name));
    [sel2,ok] = listdlg('PromptString','Select a file:','ListString',fnames);
    if ok
       evalin('base', sprintf('p1 = %s.%s; ',var(sel).name),fnames{sel2})
       assignin('base', 'p2',s);
    end
  end

end% if
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Shin
Themenstarter

Forum-Century

Forum-Century


Beiträge: 117
Anmeldedatum: 12.11.09
Wohnort: Karlsruhe
Version: ---
     Beitrag Verfasst am: 29.06.2010, 16:25     Titel:
  Antworten mit Zitat      
Episch!
Ich danke dir!

Hilft mir unglaublich weiter.
Private Nachricht senden Benutzer-Profile anzeigen
 
Shin
Themenstarter

Forum-Century

Forum-Century


Beiträge: 117
Anmeldedatum: 12.11.09
Wohnort: Karlsruhe
Version: ---
     Beitrag Verfasst am: 29.06.2010, 16:51     Titel:
  Antworten mit Zitat      
??? Error using ==> evalin
Undefined function or variable 'time'.

Error in ==> loadselected at 39
evalin('base', sprintf('p1 = %s.%s; ',var(sel).name),fnames{sel2})


Mh, irgendwe häng ich jetzt doch.
Den Inhalt der Struktur zeigt's wie geplant an, doch die Variable ist offensichtlich nicht vorhanden.

Hängt das mit dem fehlenden Pfad zusammen? Dass die Funktion die Quelle nicht weiß?
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 29.06.2010, 16:58     Titel:
  Antworten mit Zitat      
Hallo Shin

Klammer war falsch gesetzt, so sollte es sein
Code:

evalin('base', sprintf('p1 = %s.%s; ',var(sel).name,fnames{sel2}))
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Shin
Themenstarter

Forum-Century

Forum-Century


Beiträge: 117
Anmeldedatum: 12.11.09
Wohnort: Karlsruhe
Version: ---
     Beitrag Verfasst am: 30.06.2010, 13:06     Titel:
  Antworten mit Zitat      
Hallo Denny,
leider häng ich immer noch daran. Mein Problem ist, dass ich die auszuwählende Datei einfach nicht in den Workspace bekomme.

Das Programm soll in "p2" den Pfad, also den Namen der .mat-File als String anzeigen.
"p1" soll den Namen der ausgewählten Variable als String anzeigen.
Das geht soweit eigentlich auch.

Nun will ich eben noch die ausgewählte Variable/Matrix/Vektor selbst einlesen - mit Ursprungsnamen. Über p1 weiß ich ja wie diese hießt und kann drauf zugreifen.

Aber egal wie ich es hin und herdrehe, es bringt mir Fehlermeldungen, dass der Pfad nicht stimmt - ich schaff es nicht, variabel auf die .mat-File, die darin enthaltene Structure und schließlich die darin enthaltene Variable zuzugreifen.



Code:
evalin('base', sprintf('.%s',var(sel).name,fnames{sel2}))

funktioniert insofern, dass es mir den Inhalt der ausgewählten Variable in p1 schreibt. P1 soll aber wie erwähnt der Name sein und die Variable extern mit Originalname gespeichert werden.




Code:
function loadselected(fname)
if nargin==0
   [fname pname] = uigetfile('*.mat','select MAT-file');
   if ~pname ; return ; end
   s = fname;
   fname = fullfile(pname,fname);
end% if
var = whos('-file',fname);
[sel,ok] = listdlg('PromptString','Select a file:','ListString',{var.name});
if ok
  if ~strcmpi(var(sel).class,'struct')
    evalin('caller',sprintf('load %s %s',fname,sprintf('%s ',var(sel).name)))
    t = sprintf('%s ',var(sel).name);
    assignin('base', 'p1',t);
    assignin('base', 'p2',s);
  else
    evalin('caller',sprintf('load %s %s',fname,sprintf('%s ',var(sel).name)))
    fnames = evalin('caller', sprintf('fieldnames(%s);',var(sel).name));
    [sel2,ok] = listdlg('PromptString','Select a file:','ListString',fnames);
    if ok
       t = sprintf('%s',fnames{sel2});
       evalin('caller', sprintf('%s',var(sel).name,'.',fnames{sel2}))
       assignin('base', 'p2',s);
       assignin('base', 'p1',t);
    end
  end
end% if


bzw hier die ausschlaggebende Stelle des codes:
Code:
   if ok
       t = sprintf('%s',fnames{sel2});
       evalin('caller', sprintf('%s',var(sel).name,'.',fnames{sel2}))
       assignin('base', 'p2',s);
       assignin('base', 'p1',t);
    end


Damit hab ich jetzt meine p2, p1 Variable - nur die Quelldatei selbst wird als "ans" gespeichert und nicht unter ursprünglichem Namen.

Kannst du mir nochmal kurz helfen? :/
Wenn ich mit der Funktion fertig bin, kann ich das Projekt endlich abschließen. Warte da zu lange schon drauf. ^^

Nochmal vielen Dank für die Hilfe!
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 30.06.2010, 16:01     Titel:
  Antworten mit Zitat      
Hallo,
probiere einfach in allen EVALIN caller durch base zu ersetzen.

Das macht nämlich unterschied, ob Operationen in workspace durchgeführt werden, oder dort wo sie aufgerufen wurden
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.