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

Laden von .mat-File aus Funktion

 

elduderado

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.07.2010, 16:55     Titel: Laden von .mat-File aus Funktion
  Antworten mit Zitat      
Moinsen,

ich progge noch nicht lange in MatLab und hab ein ersten Problem, über das ich nicht hinweg komme. Wäre nett, wenn ihr mir helfen könntet:

Ich schreibe aus einer dll Datei ein .mat file heraus. Da dieser Vorgang ein bisschen dauert, habe ich einen Timer eingebaut, der nach 5 Sekunden die Fkt. "my_callback_fcn" aufruft. Dort möchte ich das .mat file gerne in den Workspace laden.

Doch leider funktioniert es nicht und ich bekomme eine Fehlermeldung, dass die Variable nicht deklariert ist - was auch Sinn macht. Lade ich das file vorher mit dem Wizard in den Workspace funktioniert alles.

Jetzt stellt sich mir die Frage, wie ich das .mat file in den Workspace aus einer meiner Sub Funktionen lade???

Code:
%aus der Hauptfunction
function writeDat2Xls()
%...
global incaName, simuName1;

incaName = 'T_WAND_LAMB';
simuName1 = 'TWaR2_eff1';
str = 'Pfad_der_Mat_Datei.';
%mdfload erstellt mat file
A = mdfload(strcat(str,'dat'), 'struct', 'mod0', strcat('?', incaName), '?B_stend');
t = timer('StartDelay', 5);
t.TimerFcn = {@my_callback_fcn, str};
start(t);
end
 


Code:
%aus der my_callback_fcn
function my_callback_fcn(obj, event, str_arg)
global incaName;

load(strcat('', str_arg, 'mat', ''));   %<--- Problem
i = evalin('base',sprintf('length(%s%s);', incaName, '.value'));
%...
end
 


Es folgt der Fehler:
Code:

??? Error while evaluating TimerFcn for timer 'timer-84'

Undefined variable "T_WAND_ZYL_1" or class "T_WAND_ZYL_1.value".
 


Ich habs auch schon mit:

Code:
%alternative zum load oben
S = evalin('base',sprintf('load(''%s%s'')', str_arg, 'mat'));
 


probiert aber es funktioniert einfach nicht.


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 21.07.2010, 22:01     Titel: Re: Laden von .mat-File aus Funktion
  Antworten mit Zitat      
Dear Elduderado,

Zitat:
Code:
%aus der my_callback_fcn
function my_callback_fcn(obj, event, str_arg)
global incaName;
load(strcat('', str_arg, 'mat', ''));   %<--- Problem
i = evalin('base',sprintf('length(%s%s);', incaName, '.value'));
end
 


Du lädst das MAT File in den lokalen Workspace und versuchst es danach im Base-Workspace (also praktisch in der Kommandozeile!) auszuwerten. Versuche dies:
Code:
S = load([str_arg, 'mat']);
value = S.(incaName).value;
 


Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
elduderado

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.07.2010, 10:29     Titel:
  Antworten mit Zitat      
Moin Jan,

danke erstmal, aber dass hilft mir irgendwie nur bedingt weiter.

Sobald ich auf eine zweite struct zugreifen will, z.B.:
Code:

%...
S = load([str_arg, 'mat']);
value = S.(incaName).value;
j = length(S.(B_stend).value);
%...
 

erkennt er die Struktur "B_stend" nicht. (In S bzw dem mat-file ist der incaName als auch B_stend, zeit2 und zeit3 drin)

Wenn ich das .mat file eingelesen habe im Skript und danach in der Matlab Cmd "who" eingebe, sollte er doch zumindest meine Struktur "S" als Variable anzeigen oder nicht? Das wundert mich halt, als wenn die auf einmal wieder aus dem workspace verschwindet.

Kann das etwas damit zu tun haben, dass ich das load in einer Fkt. drin hab, die aufgerufen wird? Und kann man nicht einfach das .mat file wie mit dem Wizard einfach direkt in den Workspace "ballern"?

MfG

Michael
 
elduderado_Guest

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.07.2010, 10:44     Titel:
  Antworten mit Zitat      
Ok, also ich hab ein teil des Problems gelöst Wink

Dachte mir schon, dass es an der Syntax liegen muss, zumindest das aufrufen der struct.

Sehe ich es richtig, dass runde Klammern für eine struct zum Aufruf von dynamischen Variablen ist?! Ich habe für die festen Parameter wie "B_stend" die Klammern weggelassen und siehe es funktioniert !

Was ich aber immernoch nicht verstehe ist, warum S nicht als Variable im Workspace auftaucht (wenn ich alle Variablen mit "who" aufrufe)?

MfG

Michael
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 22.07.2010, 15:20     Titel:
  Antworten mit Zitat      
Hallo elduderado,

Wenn Du das LOAD Kommando innerhalb einer Funktion aufrufst, wird der Rückgabewert im Workspace der Funktion erzeugt, nicht im Base-Workspace der Kommando-Zeile. Das ist auch eine sehr gute Idee, weil es bei größer werdenden Programmen nicht überschaubar bliebe, womit man sich den Base-Workspace zu "ballert".

Es ist sehr anzuraten, sich schon bei kleinen Programmen anzugewöhnen, die Daten nicht kreuz und quer im Base-Workspace oder als GLOBALs zu verteilen, sonden sie ordentlich zwischen den verschiedenen Funktionen als Input und Output weiter zu geben. Ich habe schon zu viele Programme gesehen, die ab einem gewissen Punkt nicht mehr erweiterbar oder pflegbar sind, da sie als kleiner Hack gestartet wurden und danach jahrelang angestückelt wurde.

Viel Erfolg, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
elduderado_Guest

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.07.2010, 16:15     Titel:
  Antworten mit Zitat      
Danke Jan,

ich habe mittlerweile mein Problem erkannt. Da ich andersweitig einiges an Programmiererfahrung habe, bin ich mir deiner beschriebenen Problematik bewusst.
Für mein spezielles Problem war es aber sinnvoll, ein paar globale Parameter festzulegen.

Gruß

Michael
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 22.07.2010, 17:05     Titel:
  Antworten mit Zitat      
Hallo elduderado,

so geht es allen ProgrammiererInnen. Manchmal sind globale Variablen, EVAL, EVALIN, ASSIGNIN und eine Kommunikation zwischen Prozessen über Files einfach dreckig aber wirkungsvoll.

Ich wollte aber Anfänger, die dieses Forum lesen, davor warnen sich zu viel davon abschauen und sich damit das Programmieren schwerer zu machen, als nötig.

Gruß, Jan
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.