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

Daten in GUI laden

 

Schnu
Forum-Anfänger

Forum-Anfänger


Beiträge: 23
Anmeldedatum: 28.09.09
Wohnort: Duisburg
Version: ---
     Beitrag Verfasst am: 01.02.2010, 16:55     Titel: Daten in GUI laden
  Antworten mit Zitat      
Hallo zusammen.

Ich habe mittels nested functions ein GUI geschrieben in dem Daten gespeichert, weiter verarbeitet, geplottet und auch wieder geladen werden sollen.
Leider funktioniert das mit dem Laden der Daten, die in einer struct gespeichert sind, überhaupt nicht.

Dateiname ist gegeben über Datei und die Variable, die ich laden möchte heißt Daten.

Code:


function[] = pb_Daten_oeffnen_call(varargin)

[Datei,Pfad] = uigetfile('../*.mat');  %Dateinamen und speicherort holen
cd (Pfad); %Pfad öffnen
load (Datei, 'Daten'); %Daten laden
alteDaten=Daten;
end

 



Dieser code funktioniert in einem gewöhlichen script sehr gut, aber nicht in meinem GUI.

ich habe es auch mit 'evalin' versucht, was aber nicht für eine struct geeignet ist.

Code:
alteDaten = evalin ('base', load (Datei, 'Daten'));


Jedenfalls kommt die Fehlermeldung:

Undefined function or method 'evalin' for input arguments of type 'struct'.

Ich komme leider nicht weiter.
Ich bin sicher ihr könnt mit helfen.
Vielen Dank.
SCHNU
Private Nachricht senden Benutzer-Profile anzeigen


denny
Supporter

Supporter



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

Der ganze Ausdruck in evalin muss String sein:

Code:

alteDaten = evalin ('base', sprintf('load (''%s'', ''Daten'')',Daten));
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Schnu
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 23
Anmeldedatum: 28.09.09
Wohnort: Duisburg
Version: ---
     Beitrag Verfasst am: 03.02.2010, 08:30     Titel:
  Antworten mit Zitat      
Hallo.
Danke, das hilft mir schon viel weiter.

Jetzt habe ich ein Problem mit dem Zusammenfügen der Daten, also, der geladenen Daten und der Daten, die ich zu diesen hinzufügen möchte.
Ich bekomme die Fehlermeldung:

CAT arguments are not consistent in structure field number.

Wenn ich mir die struct mal anzeigen lasse, bekomme ich folgendes:

Code:


liefert:
Daten: [1471x1 struct]

Öffne ich die Datei mit MATLAB und führe dann den disp aus bekomme ich folgendes:

1471x1 struct array with fields:
BR
Teilzug
Wagenteil
Zugnummer
Wagennummer
Subsystem
Fehlercode
Fehlertext
Kommt_Zeit
Geht_Zeit
Wartung_Kommt_Zeit
Wartung_Geht_Zeit
Anzahl_gekuppelter_Zuege
verkehrende_Zugnummer
Dateiname
Dateisendezeit
Anstehdauer
WP_S
WP_F
Datentyp
Tag
Kalenderwoche
Monat
Stunde
Anstoss

Dies entspricht meiner struct.

Worin liegt der Unterschied?

Gruß
SCHNU
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 03.02.2010, 08:57     Titel:
  Antworten mit Zitat      
Hallo,

Der Unterschied liegt darin, dass du einmal load mit Zuweisung und einmal ohne Zuweisung aufrufst.

Wenn du load mit Zuweisung aufrufst, dann wird Variable
in Mat-File als Strukturfeld zugewiesen.
Code:

alteDaten= load(Datei,'Daten')
%
% Daten Variable, wird als Struct-Feld an alteDaten zugewiesen
% Zugriff auf Ursprungs-Struktur erfolgt dann so:
alteDaten.Daten
 


Wenn du load ohne Zuweisung aufrufst, dann wird Variable
in Mat-File direkt in Workspace geladen.

Code:


load(Datei,'Daten')

Daten
 



Damit zusammenfügen bei dir funktioniert

Überschreibe direkt nach dem Laden alteDaten=alteDaten.Daten,
dann sollte alles wie erwartet funktionieren
Code:

alteDaten = evalin ('base', sprintf('load (''%s'', ''Daten'')',Daten));
alteDaten = alteDaten.Daten;
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Germanus
Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 15.12.09
Wohnort: ---
Version: 7.8.0 (R2009b), Linux
     Beitrag Verfasst am: 07.10.2010, 09:20     Titel:
  Antworten mit Zitat      
Hallo,

auch ich habe den Fehler "Undefined function or method 'evalin' for input arguments of type 'struct'." erhalten, als ich eine struct-Variable mit evalin('basic', ...) von einer Funktion aus verändern wollte. Bei der Vereinfachung des Problems habe ich weitere andere Fehlermeldungen erhalten, die durch die falsche Verwendung der Workspaces beruhen.

Auch wenn die Frage hier nicht hundertprozentig richtig ist, versuche ich es trotzdem einmal:

Ich möchte von einer Funktion aus eine Variable im 'basic'-WS speichern, die in der Funktion definiert ist (in der Funktion ist ihr ein Wert, ein Text oder eine Struktur zugewiesen). Allerdings weiß ich nicht, wie ich, einmal im 'basic' wieder in den functions-WS (temporär) zurück zeige?

Folgendes Minimalbeispiel veranschaulicht die Idee, funktioniert aber leider nicht.

Code:

function variable_ueberschreiben()

zahl = 100;

evalin('base', 'testvar1=100') % Diese Zeile funktioniert
evalin('base',['testvar2=',zahl]) % Hier wird die Variable Zahl nicht gefunden, da nicht in 'basic' vorhanden

end
 


Ich erhalte die Fehlermeldung:


??? Error using ==> evalin
Undefined function or variable 'd'.


Später einmal soll eine Variable im 'basic' mit einer Variablen aus der Funktion überschrieben werden, wobei die Funktionsvariable über einen "Pointer" aufgerufen werden soll.

Vielen Dank für eure Hilfe!

Mit freundlichem Gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 07.10.2010, 09:46     Titel:
  Antworten mit Zitat      
Hallo

Wie schon in alle Beträgen hier erwähnt worden ist:
EVALIN akzeptiert nur Ausdrücke in STRING-Format!!!
Also Bitte aufpassen, daß der Ausdruck den Wunsch Vorstellung entspricht.

Jetzt zu deinem Fehler:
1) Die Variable zahl ist von Typ Double.
2) Du versuchst String mit Double zusammenzusetzen
Code:

zahl=100
['testvar2=',zahl]
 

Was kommt dabei deiner Meinung heraus?

Zitat:

ans =

testvar2=d

Double wird automatisch nach Char konvertiert, wenn man also 100 hat dann ist es laut Ascii-Tabelle d
Code:


3) EVALIN wertet jetzt den Ausdruck: testvar2=d
Also muss EVALIN testvar2 Variable d in Workspace zuweisen.
Diese Variable d existiert nicht in Workspace, also folglich kommt es zum oben genannten Fehler.


Also muss du entweder SPRINTF oder NUM2STR nutzen um den Ausdruck in String zu bringen

Code:

zahl =100

evalin('base',['testvar2=', num2str(zahl)])

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

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 15.12.09
Wohnort: ---
Version: 7.8.0 (R2009b), Linux
     Beitrag Verfasst am: 07.10.2010, 12:06     Titel:
  Antworten mit Zitat      
Hey Denny,

vielen Dank für die schnelle Antwort! Diese hat mir unter anderem geholfen, ein Problem mit fprints() zu verstehen, für das du mir eine Lösung gegeben hast (für alle die es interessiert: http://www.gomatlab.de/korrekter-gebrauch-von-fprintf-t2825.html

Mit deinem Rat habe ich das Ganze mittels sprintf() realisiert, allerdings habe ich nun mit evalin() ein Problem:


??? Undefined variable "myLocal" or class "myLocal.Value".


Zitat:

Ich möchte von einer Funktion aus eine Variable im 'basic'-WS speichern, die in der Funktion definiert ist (in der Funktion ist ihr ein Wert, ein Text oder eine Struktur zugewiesen). Allerdings weiß ich nicht, wie ich, einmal im 'basic' wieder in den functions-WS (temporär) zurück zeige?


Hier noch ein Minimalbeispiel:

Code:

function myfkt()
%%  Eingabe Werte:
myLocal.Value= 10;
pointer = 'myLocal.Value';

%% Verarbeitung und Ausgabe Werte:
% Im Funktions-WS:
eval(sprintf('testvar_loc=%s',pointer)) % funktioniert
% Im Base-WS:
evalin('base',sprintf('testvar_bas=%s',pointer)) % führt zu einem Fehler
end
 


Mit freundlichem Gruß,
Germanus
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 07.10.2010, 12:52     Titel:
  Antworten mit Zitat      
Die Variable muss ja in Workspace definiert sein. Also in "base".

Jede Funktion hat eigenes Workspace, und sie können nur auf dieses Workspace zugreifen. Du hast diese Variable ja nur in der Funktion definiert.
Deswegen kommt es zu Fehlermeldung
EVALIN und ASSIGNIN sind dazu da, um zwischen Workspaces auszutauschen.

base ist dabei zentrales Workspace, wo du auch über die Konsole zugreifst.
caller ist der Workspace der Funktion, welche diese Funktion aufruft.

EVAL arbeitet dagegen nur in aktuellen Workspace

Code:

function myfkt()
%%  Eingabe Werte:
myLocal.Value= 10;
pointer = 'myLocal.Value';

% vorher in base definieren
evalin('base','myLocal.Value= 10')
% Im Base-WS:
evalin('base',sprintf('testvar_bas=%s',pointer))
end
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Germanus
Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 15.12.09
Wohnort: ---
Version: 7.8.0 (R2009b), Linux
     Beitrag Verfasst am: 07.10.2010, 14:12     Titel:
  Antworten mit Zitat      
Schade, wenn man die Variable vor der Zuweisung extra in den 'base' schiebt, dann ist ja einer der großen Vorteile (nämlich Kapselung) von function wieder weg.

Um die Variable vorher nicht in 'base' schreiben zu müssen, habe ich es mal mit assignin() versucht. Allerdings geht dies nur eingeschränkt für structs.

WARUM???

Problem hierbei ist, dass mit dieser Form das Unter-struct einfach überschrieben und nicht ergänzt wird. Damit wird meine gesamte Funktion, die meinen Substruct mit Elementen ergänzen soll und die ich gerade um diese unten beschriebene Teilfunktion herumbastle zunichte gemacht.

Code:

function myfkt()

clc, evalin('base','clear')
%% Eingabe:
myLocal.Value = 41;
pointer_local = 'myLocal';
pointer_base = 'myBase';

evalin('base','myBase.Value=100')

%% Verarbeitung und Ausgabe:
evalin('base',...
   'msgbox([''myBase.Value hat den Wert: '',num2str(myBase.Value)])')

% So geht die Zuweisung noch gut, aber der substruct wird überschrieben:
assignin('base',pointer_base,eval(eval('pointer_local')))

evalin('base',...
   'msgbox([''myBase.Value hat den Wert: '',num2str(myBase.Value)])')

% Hier klemmts
pointer_base1 = 'myBase.subBase';
assignin('base',pointer_base1,eval(eval('pointer_local')))

end
 



P.S.:
Ich glaube ich sollte bald mal eine neue Diskussion zum Thema structs ergänzen aufmachen.
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 07.10.2010, 14:55     Titel:
  Antworten mit Zitat      
Zitat:
Schade, wenn man die Variable vor der Zuweisung extra in den 'base' schiebt, dann ist ja einer der großen Vorteile (nämlich Kapselung) von function wieder weg.


Was verstehst hier du unter Kapselung? Dazu gibt es Funktionen und Unterfunktionen.

EVALIN ist nicht der Sinn dazu. Das ist nur eine Methode, um auf die Daten einer zentraler Stelle zuzugreifen oder die Daten zu manipulieren. Die Methode ist aber sehr "dirty", also sollte man grundsätzlich die Finger davon lassen.


Zitat:
Um die Variable vorher nicht in 'base' schreiben zu müssen, habe ich es mal mit assignin() versucht. Allerdings geht dies nur eingeschränkt für structs.


ASSIGNIN ist nur für einfache Variablen möglich, nicht für Structs.


Zitat:
Problem hierbei ist, dass mit dieser Form das Unter-struct einfach überschrieben und nicht ergänzt wird. Damit wird meine gesamte Funktion, die meinen Substruct mit Elementen ergänzen soll und die ich gerade um diese unten beschriebene Teilfunktion herumbastle zunichte gemacht.


Wie Gesagt die Daten sollte dann schon in Workspace vorliegen, und die Funktion manipuliert nur diese Daten einwenig. Ich glaube du sollst mal beschreiben was du überhaupt erreichen willst, sonst entsteht bereits Wirrwarr
Private Nachricht senden Benutzer-Profile anzeigen
 
Germanus
Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 15.12.09
Wohnort: ---
Version: 7.8.0 (R2009b), Linux
     Beitrag Verfasst am: 07.10.2010, 17:50     Titel:
  Antworten mit Zitat      
meine Ausführungen habe ich mal passender in (Addieren von Strukturen) http://www.gomatlab.de/viewtopic,p,53478.html#53478 einsortiert, da die nun anstehende Diskussion nix mit GUIs mehr zu tun hat.

@Denny: Vielen Dank für die bisherigen schnellen Antworten!
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.