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 einlesen und in Table ausgeben

 

R0b1
Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 11.01.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.01.2013, 11:20     Titel: Daten einlesen und in Table ausgeben
  Antworten mit Zitat      
Hallo!

Ich sitz jetzt schon ewig an folgendem Problem: Ich möchte meine aus einer matlab-Datei eingelesenen Daten (1. Spalte mit Namen, 2. Spalte mit Werten, mehrere Zeilen lang) in meine Tabelle (table_Parameter) schreiben und auf der GUI anzeigen.

Code:

[filename pathname] = uigetfile('..\Dateipfad\*.mat', 'Select a MATLAB code file');    
 
global Parameterset;
evalin('base', 'global Parameterset');
 
Parameterset = load([pathname filename]);         % Datei laden (Inhalt wird in Parameterset geschrieben)
 
parameter_names = fieldnames(Parameterset);       % Erhalten der Parameternamen
parameter_values = struct2cell(Parameterset);     % Erhalten der Parameterwerte

paramset_table = [parameter_names, parameter_values];
 
set(handles.table_Parameter, 'Data', paramset_table);
 


Folgender Fehler tritt immer auf:
Error using set
Data within a cell array must have size [1 1]

set(handles.table_Parameter, 'Data', paramset_table);

Muss ich vllt in der GUI am table noch irgendwas einstellen?
Private Nachricht senden Benutzer-Profile anzeigen


Mmmartina
Forum-Meister

Forum-Meister


Beiträge: 745
Anmeldedatum: 30.10.12
Wohnort: hier
Version: R2020a
     Beitrag Verfasst am: 11.01.2013, 12:12     Titel:
  Antworten mit Zitat      
Überprüf mal, welches Format deine parameter_values haben.
Es muss sich meines wissens nach um ein CellArray handeln.
_________________

LG
Martina

"Wenn wir bedenken, daß wir alle verrückt sind, ist das Leben erklärt." (Mark Twain))
Private Nachricht senden Benutzer-Profile anzeigen
 
R0b1
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 11.01.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.01.2013, 12:44     Titel:
  Antworten mit Zitat      
Das gibt mir der Debugger aus:

parameter_names: 1x1 cell = 'Parameterset'
parameter_values: 1x1 cell = [1x1 struct]
Private Nachricht senden Benutzer-Profile anzeigen
 
Mmmartina
Forum-Meister

Forum-Meister


Beiträge: 745
Anmeldedatum: 30.10.12
Wohnort: hier
Version: R2020a
     Beitrag Verfasst am: 11.01.2013, 13:12     Titel:
  Antworten mit Zitat      
ja, ok.
aber was genau ist in jedem Cell enthalten?
Wenn du Parameterset im Command Window eingibst, was wird dir dann angezeigt?
_________________

LG
Martina

"Wenn wir bedenken, daß wir alle verrückt sind, ist das Leben erklärt." (Mark Twain))
Private Nachricht senden Benutzer-Profile anzeigen
 
R0b1
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 11.01.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.01.2013, 07:49     Titel:
  Antworten mit Zitat      
Wenn ich das eingebe, zeigt er mir auch nur [1x1 struct]

Wenn ich so jetzt nicht weiterkomme, welche Möglichkeiten gibt es denn noch eine Tabelle zu beschreiben?
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: 14.01.2013, 08:10     Titel: Re: Daten einlesen und in Table ausgeben
  Antworten mit Zitat      
Hallo R0b1,

Bis auf wenige Ausnahmen sind die Fehlermeldungen von Matlab sehr hilfreich. Wenn in der Meldung dann steht: "Data within a cell array must have size [1 1]" lohnt es sich, die Daten der Cell anzuschauen. In Deinem Fall ist das "paramset_table", und eben nicht "Parameterset".

Mit LOAD lädst Du den Inhalt des MAT-Files in einen Struct. Dieser Struct enthält den Fieldname "Parameterset". Ich rate aber, dass Du stattdessen den Inhalt dieses Feldes möchtest, da Du, wie die Fehlermeldung ja explizit sagt, keinen Struct in einem Feld der UITABLE darstellen kannst:
Code:
Parameterset = load(fullfile(pathname, filename));
Data = Parameterset.Parameterset;
parameter_names = fieldnames(Data);       % Erhalten der Parameternamen
parameter_values = struct2cell(Data);       % Erhalten der Parameterwerte
 


Das Hantieren mit globalen Variablen und vorallem noch das "ferngesteuerte" Deklarieren globaler Variablen in einem anderen Workspace, ist anfällig für Fehler und erschwert das Debuggen so stark, dass es ab einer gewissen Programm-Größe nicht mehr zu warten ist. Deshalb empfehle ich dringend etwas wie "evalin('base', 'global Parameterset')" anders zu lösen.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
R0b1
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 11.01.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.01.2013, 09:34     Titel:
  Antworten mit Zitat      
Hallo Jan, aus der Ausgabe des Command Window werde ich aber leider nicht schlau.

K>> parameter_names

parameter_names =

'Parameterset'

K>> parameter_values

parameter_values =

[1x1 struct]

K>> paramset_table

paramset_table =

'Parameterset' [1x1 struct]


Ich habe aber mittlerweile rausgefunden was falsch ist:
Code:

load([pathname filename]);         % Datei laden (Inhalt wird in Parameterset geschrieben)
 


Der Inhalt wird dann automatisch in Parameterset geschrieben, obwohl ich die Zuweisung weglasse. Hat dafür jmd eine Erklärung?

Mit den globalen Variablen hast du natürlich Recht, damit muss ich mich auch nochmal auseinandersetzen.
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: 14.01.2013, 11:20     Titel:
  Antworten mit Zitat      
Hallo R0b1,

LOAD ohne das Speichern der Ausgabe in einer Variablen schreibt den Inhalt des Files direkt in den aktuellen Workspace. Damit hat man schon wieder eine Art ferngesteuerter dynamischer Variablen-Erzeugung. Einerseits verlangsamt das die Ausführung des Code deutlich, andererseits handelt man sich wiederum Schwierigkeiten beim Debuggen ein. Beispiel:
Code:
for i = 1:10
  load('TestData.mat');
  disp(i);
end

Falls nun im MAT-File eine Variable "i" steht, wird diese ausgegeben, statt der Laufvariable der Schleife. Noch schlimmer wird es, wenn das MAT-File eine Variable mit Namen "disp" enthält. Dann wird im Debug-Modus diese Variable verwendet und "(i)" als Index betrachtet, aber im Nicht-Debug-Modus kann dies anders aussehen.

Deswegen rate ich dringend, LOAD immer mit Output-Argument zu benutzen. Dann wird der Inhalt in ein Struct geschrieben und man kann die gewünschten Variablen als Felder vorfinden.

Bitte untersuche den Inhalt des MAT-Files nochmal genau.
Code:
Data = load('TestData.mat');
disp(Data)

Nun ist Data ein Struct, und die Fieldnames werden angezeigt, vielleicht als "Parameterset". Dann:
Code:
disp(Data.Parameterset)

usw. So kannst Du Dich durch das verschachtelte Struct durcharbeiten bist Du herausfindest, in welchem Unter-Feld Deine Daten wie gespeichert sind.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
R0b1
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 11.01.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.01.2013, 13:14     Titel:
  Antworten mit Zitat      
Ok, das Problem, was du geschildert hast, hab ich verstanden. Hab das nun genau so gemacht, wie du vorgeschlagen hast. Hab es erst der Variablen "Data" zugewiesen und später

Code:

parameter_names = fieldnames(Data.Parameterset);
parameter_values = struct2cell(Data.Parameterset);
 


Ich habe allerdings noch nicht den Hintergrund verstanden. Wenn ich nur Data schreibe, geht es nicht. Wenn ich allerdings Data.xxx schreibe funktioniert es. Weiß das Programm denn automatisch, dass es sich um ein Struct handelt, wenn ich ".xxx" schreibe?
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: 14.01.2013, 14:50     Titel:
  Antworten mit Zitat      
Hallo R0b1,
Zitat:
Weiß das Programm denn automatisch, dass es sich um ein Struct handelt, wenn ich ".xxx" schreibe?

Ja. Wenn ein Punkt auf einen Variablennamen folgt, geht Matlab davon aus, dass die Variable ein Struct ist und nach dem Punkt der Feld-Name kommt.

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.