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

speichern eines Structs mit variablen Namen

 

JN78
Forum-Fortgeschrittener

Forum-Fortgeschrittener



Beiträge: 69
Anmeldedatum: 18.05.09
Wohnort: Stuhr
Version: R2010b, R2011a
     Beitrag Verfasst am: 05.05.2011, 12:30     Titel: speichern eines Structs mit variablen Namen
  Antworten mit Zitat      
Moin Zusammen,

ich steht grad auf dem Schlauch, was das abspeichern eines Structs anbelangt. Für diverse Berechnungen muss ich mir binäre Dateien in Matlab einlesen. Die Daten werden durch eine andere Routine in ein Struct eingelesen, da ich schon eine handvoll von weiteren Routinen und Funktionen für diverse Berechnungen habe, ist es mir wichtig, das die einzelnen eingelesenen Structs einen identischen aufbau haben. Ich hab mir also eine Routine geschrieben, die die eingelesenen Dateien/Structs entsprechend umsortieren bzw. aufbauen soll. Dieses Script wollte ich nun als Funktion, in eine andere einbinden, jetzt klappt aber das abspeichern nicht mehr.

das hier funktioniert nicht:
Code:
%% fn_nstrOrder

function fn_nstrOrder(filename)

data = load(filename);

%% Anzahl der Kanäle berechnen
numChannels = size(data.Channel,2);

%% neue Namen und Bezeichnungen anlegen

NewStructName = strcat('M_',filename(4:7),'_',filename(9:10),'_',filename(12:13),'_',filename(15:16),'_',filename(18:19));
NewSaveName = strcat(NewStructName,'.mat');

DataStruct = struct;

for n=1:numChannels
NewChannelName = data.Channel(1,n).name;

%% Daten auslesen und in neue Struktur schreiben

DataStruct.(NewChannelName).name = data.Channel(1,n).name;
DataStruct.(NewChannelName).data = data.Channel(1,n).data;
DataStruct.(NewChannelName).comment = data.Channel(1,n).comment;
DataStruct.(NewChannelName).length = data.Channel(1,n).length;
DataStruct.(NewChannelName).xUnit = data.Channel(1,n).xUnit;
DataStruct.(NewChannelName).yUnit = data.Channel(1,n).yUnit;
DataStruct.(NewChannelName).t0 = data.Channel(1,n).t0;
DataStruct.(NewChannelName).dt = data.Channel(1,n).dt;

end

%Struct "DataStruct" umbenennen in NewStructName
assignin('base', NewStructName, DataStruct)

%% Daten abspeichern

save(NewSaveName, NewStructName, '-v6')

end


jetzt heißt es als Fehler immer:
Code:
??? Error using ==> save
Variable 'M_2010_10_07_00_00' not found.

Error in ==> fn_nstrOrder at 38
    save(NewSaveName, NewStructName, '-v6')


Es wird also keine Datei mit entsprechendem Namen abgespeichert. Merkwürdiger weise ist danach, allerdings eine Struct mit entsprechendem Namen im Workspace geladen.

Wenn ich das ganze nicht versuche als Funktion umzusetzen, dann funktioniert alles ohne Fehlermeldung.

Dies hier funktioniert:
Code:

%% nstrOrder

%% Initialisieren
tic
close all
clc
c=cputime;
disp('***** Neuordnung der Daten startet! *****');
disp('   ');

%% Anzahl der Dateien feststellen

file = dir('Mx*.mat');
tmp = length(file);

%% Dateien laden, Bearbeitung staten

for i=1:tmp
    data = load(file(i).name);

    %%
    %Anzahl der Kanäle berechnen
    numChannels = size(data.Channel,2);

    %% neue Namen und Bezeichnungen anlegen
    % Namen für Kanäle und Strukturen erzeugen
    NewStructName = strcat('M_',file(i).name(4:7),'_',file(i).name(9:10),'_',file(i).name(12:13),'_',file(i).name(15:16),'_',file(i).name(18:19));
    NewSaveName = NewStructName;

    DataStruct = struct;
    for n=1:numChannels
        NewChannelName = data.Channel(1,n).name;

    %% Daten auslesen und in neue Struktur schreiben

        DataStruct.(NewChannelName).name = data.Channel(1,n).name;
        DataStruct.(NewChannelName).data = data.Channel(1,n).data;
        DataStruct.(NewChannelName).comment = data.Channel(1,n).comment;
        DataStruct.(NewChannelName).length = data.Channel(1,n).length;
        DataStruct.(NewChannelName).xUnit = data.Channel(1,n).xUnit;
        DataStruct.(NewChannelName).yUnit = data.Channel(1,n).yUnit;
        DataStruct.(NewChannelName).t0 = data.Channel(1,n).t0;
        DataStruct.(NewChannelName).dt = data.Channel(1,n).dt;

    end

    %Struct "DataStruct" umbenennen in NewStructName
    assignin('base', NewStructName, DataStruct)

    %% Daten abspeichern

    save(NewSaveName, NewStructName, '-v6')

end


Für einen Tipp oder Lösungsansatz wäre ich sehr dankbar.


Gruß Jan
_________________

Ich bin ein Schwamm, denn ich sauge Ideen auf und mache sie nutzbar. Die meisten meiner Ideen gehören ursprünglich anderen Leute, die sich halt nicht mehr die Mühe gemacht haben, sie weiterzuentwickeln. Thomas Alva Edison (1847 - 1931)
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: 05.05.2011, 23:16     Titel:
  Antworten mit Zitat      
Hallo Jan,

Jede Funktion hat ihren eigenen Workspace. Du erstellst eine Variable im Base-Workspace, versuchst sie dann aber innerhalb der Funktion zu speichern. Dort wurde sie aber gar nicht erstellt.

Es gibt gar keinen Grund, der Variable einen bestimmten Namen zu geben. Denn wenn Du sie in ein MAT-File speicherst, wird nur der Inhalt ins file geschrieben. "save(NewSaveName, 'DataStruct', '-v6')" wäre also hinreichend.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener



Beiträge: 69
Anmeldedatum: 18.05.09
Wohnort: Stuhr
Version: R2010b, R2011a
     Beitrag Verfasst am: 06.05.2011, 10:34     Titel:
  Antworten mit Zitat      
Hallo Jan S,


ich möchte bzw. muss zu einem späterem Zeitpunkt mehrer Dateien mit den "DataStructs" in den Workspace laden. Wenn ich diese so speicher wie Du es vorschlägst, heissen sie alle gleich nämlich "DataStruct" und es lässt sich deshalb nur eines davon laden. Meine Idee war daher, diesen Structs denselben Namen wie dem *.mat File zu verpassen.

Gruß Jan
_________________

Ich bin ein Schwamm, denn ich sauge Ideen auf und mache sie nutzbar. Die meisten meiner Ideen gehören ursprünglich anderen Leute, die sich halt nicht mehr die Mühe gemacht haben, sie weiterzuentwickeln. Thomas Alva Edison (1847 - 1931)
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: 09.05.2011, 15:53     Titel:
  Antworten mit Zitat      
Hallo Jan,

Ein Standard-Problem - siehe meine anderen Posts heute...
Code:

DataList = cell(1, 10);
for i = 1:10
  Data{i} = load(FileName{i});
  % Oder:
  % Loaded = load(FileName{i});
  % Data{i} = Loaded.DataStruct;
  % Oder:
  % Data{i} = load(FileName{i}, 'DataStruct');
end

Und schon hast Du 10 Structs mit gleichem Namen geladen und kannst auch noch ganz komformtabel per Index darauf zugreifen, statt erst wieder eine komplizierte Methode zubenötigen um die Variablennamen erneut für den Zugriff zu erstellen...

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener



Beiträge: 69
Anmeldedatum: 18.05.09
Wohnort: Stuhr
Version: R2010b, R2011a
     Beitrag Verfasst am: 09.05.2011, 18:51     Titel:
  Antworten mit Zitat      
Hallo Jan S.

das ist ein echt schöner Lösungsansatz - hat Charme.
Das in dieser Art umzusetzen, ist in der Tat sehr viel einfacher.

Danke für den Lösungsatz.


JN
_________________

Ich bin ein Schwamm, denn ich sauge Ideen auf und mache sie nutzbar. Die meisten meiner Ideen gehören ursprünglich anderen Leute, die sich halt nicht mehr die Mühe gemacht haben, sie weiterzuentwickeln. Thomas Alva Edison (1847 - 1931)
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.