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

setappdata/load/caller-Problem - Wo steckt die Variable?

 

Shin
Forum-Century

Forum-Century


Beiträge: 117
Anmeldedatum: 12.11.09
Wohnort: Karlsruhe
Version: ---
     Beitrag Verfasst am: 24.03.2011, 17:14     Titel: setappdata/load/caller-Problem - Wo steckt die Variable?
  Antworten mit Zitat      
Hallo, ich hab folgendes Problem:
In einer Button Callback Funktion rufe ich eine weitere Funktion auf, um Daten (mat files) einzulesen.
Mit folgendem Code soll die eingelesene Variable einer Matfile geladen werden - das tut es auch, ich kann sie aber nicht finden.
Code:
evalin('caller',sprintf('load %s %s',fname,sprintf('%s ',var(sel).name)))

Kann ich das irgendwie so umschreiben, dass ich die Variable samt Inhalt mit setappdata speichern kann? Den Namen der Variable bekomme ich durch
Code:
  t = sprintf('%s ',var(sel).name);
raus, aber der Inhalt fehlt.
Wenn ich die Einlesefunktion direkt öffne, landet die Variable im Standard Workspace.

Code:
  setappdata(0,'test',sprintf('load %s %s',fname,sprintf('%s ',var(sel).name))))
Gibt mir:
test = load D:\\..Pfad...
Also da steht der Pfad samt load in der Variable drin, führt den load befehl aber nicht aus.


Hier mal die ganze Einlesefunktion:
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
   setappdata(0,'test',sprintf('load %s %s',fname,sprintf('%s ',var(sel).name))))
   t = sprintf('%s ',var(sel).name);

end% if
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: 24.03.2011, 22:44     Titel: Re: setappdata/load/caller-Problem - Wo steckt die Variable?
  Antworten mit Zitat      
Hallo Shin,

Zitat:
Code:

evalin('caller',sprintf('load %s %s',fname,sprintf('%s ',var(sel).name)))

Meinst Du so etwas:
Code:
Data = load(fname, var(sel).name)

Danach stehen die Daten in "Data" zur Verfügung.

Gruß, Jan
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: 25.03.2011, 14:32     Titel:
  Antworten mit Zitat      
Hab mit dem von Jan geposteten Ansatz jetzt weiter gemacht.

t = 'V16b_BP4_W2zu_HQ100'
zwischenvar <1x1 struct> mit Inhalt: V16b_BP4_W2zu_HQ100 <11x1 double>

Code:

>> zwischenvar = getappdata(0,'zwischenvar');
>> t = getappdata(0,'t');
>> zwischenvar = getappdata(0,'zwischenvar');
>> eval([t  '=zwischenvar.(num2str(t))']);
[color=red]??? Reference to non-existent field 'V16b_BP4_W2zu_HQ100 '.[/color]


Non existing field?
Es ist doch vorhanden?
Ich dreh noch durch. Ich versteh' einfach nicht woran es hängt.

Hoffe der Ansatz ist wenigstens richtig.


Nochmal zum Verständnis:

In einer Funktion wird eine Variable einer matfile eingelesen.
Ich habe in t den Variablennamen. In struct zwischenvar steckt die Variable.
Ich will die Variable (deren Name das Skript direkt nicht weiß) extrahieren und weiterverarbeiten können.



___________________

edit:


Code:

>> eval([t  '=zwischenvar.V16b_BP4_W2zu_HQ100']);

funktioniert. Also muss es am num2str(t) hapern. Sad

edt 2:
Code:
>> eval([t  '=zwischenvar.(t)']);
??? Reference to non-existent field 'V16b_BP4_W2zu_HQ100 '.
 

Geht auch nicht. Wtf!
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: 25.03.2011, 15:05     Titel:
  Antworten mit Zitat      
Hallo Shin,

Offenbar verwirrt Dich das EVAL und EVALIN heftig. Das ist auch nicht verwunderlich, sondern sozusagen ein eingebautes Feature. Deshalb rate ich immer wieder von der Benutzung ab. Es geht nämlich ohne EVAL und EVALIN schneller, lesbarer, weniger Fehleranfällig, sicherer und deshalb besser.

Meinst Du vielleicht dies?
Code:
t = zwischenvar.('V16b_BP4_W2zu_HQ100');

Gruß, Jan
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: 25.03.2011, 15:07     Titel:
  Antworten mit Zitat      
Hallo Jan,
danke für deine Antwort.

Das soll da stehen - ABER ich weiß den Namen der Variable (V16b_BP4_W2zu_HQ100) nicht. Daher muss das variabel über den in t stehenden String geschehen.
Und ich bekomme es einfach nicht hin. :/
Private Nachricht senden Benutzer-Profile anzeigen
 
_Peter_
Moderator

Moderator


Beiträge: 537
Anmeldedatum: 08.12.10
Wohnort: ---
Version: 7.10, 2010a
     Beitrag Verfasst am: 25.03.2011, 15:18     Titel:
  Antworten mit Zitat      
Hallo Shin,
Code:

string = 'V16b_BP4_W2zu_HQ100';
zwischenvar.(string);
 

_________________

Gruß
Peter
_________________
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht? Oder der MATLAB Hilfe?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?
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: 25.03.2011, 15:21     Titel:
  Antworten mit Zitat      
Hallo Peter,
soweit habe ich jetzt schon.
Jetzt sollen die Daten aus
Code:
string = 'V16b_BP4_W2zu_HQ100';
zwischenvar.(string);
in einer Variable namens 'V16b_BP4_W2zu_HQ100' gespeichert werden.
Der Name ist je nach Nutzung immer anders, steckt aber in meiner Variable t drin. (bzw. hier in "string")
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: 25.03.2011, 15:23     Titel:
  Antworten mit Zitat      
Thema beendet:

Code:
string = 'V16b_BP4_W2zu_HQ100';
zwischenvar.(string);

gibt mir den Inhalt meiner Struct.Variable in ans aus

und mit

Code:
eval([t  '=ans']);


erreiche ich dann meine Variable
V16b_BP4_W2zu_HQ100 = inhalt


Oh man, war das 'ne Geburt.

Danke an alle!
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: 26.03.2011, 01:42     Titel:
  Antworten mit Zitat      
Hallo Shin,

Zitat:
Code:
eval([t  '=ans']);

Diesen Schritt würde ich auf jeden Fall weglassen. Ich habe in diesem (und anderen) Foren Dutzende, Hunderte Fragen gelesen, bei denen das Erzeugen von dynamischen Variablen zu vielen Fehlern führte. Der Name 'V16b_BP4_W2zu_HQ100' ist für eine Variable einfach beim besten Willen nicht sachdienlich: 19 Buchstaben, aber ein nicht vollständig eingeweihter Leser hat trotzdem nicht die geringste Ahnung, was in der Variable steht!
Zudem noch EVAL und ANS zu verwenden macht den Befehl zerbrechlich.

Ich würde entweder:
Code:
t = zwischenvar.(string)

verwenden, oder gleich einen sinnvollen Struct definieren:
Code:
Data.Value = [1,2,4,6,7,9];
Data.HQ = 100;
Data.W2 = 'zu';
Data.BP = 4;
Data.V = '16b';

Dann wären die wichtigen Informationen nicht in magischen Variablen-Namen versteckt und Du müsstest Dich nicht mit dem fehlerträchtigen EVAL herumschlagen.

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.