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

mehrere Dateinamen in einzelne Variable einlesen

 

MoTSCHIGGE
Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 22.12.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.02.2013, 20:21     Titel: mehrere Dateinamen in einzelne Variable einlesen
  Antworten mit Zitat      
Hallo,

kann mir jemand sagen, was ich hier falsch mache:

Code:

name1 = 'Dateiname1';
name2 = 'Dateiname2';
name3 = 'Dateiname3';
name4 = 'Dateiname4';

for i=1:4
namen (i) = eval(['name' num2str(i)]);
end
 


Ich möchte einfach die 4 Dateinamen oben in die Variable "namen" einlesen (soll ein cell array werden). Ich bekomme immer die Meldung "Subscripted assignment dimension mismatch."
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: 27.02.2013, 23:35     Titel: Re: mehrere Dateinamen in einzelne Variable einlesen
  Antworten mit Zitat      
Hallo MoTSCHIGGE,

Es tut immer weh, wenn jemand Indices in die Namen von Variablen schmuggelt. Das mach immer unnötig viel Ärger und das Herumwursteln mit EVAL ist fehleranfällig. Ich rate dringend davon ab, da es immer eine bessere und effizientere Möglichkeit gibt.

Trotzdem liegt das Problem in Deinem Code an den Klammern: Cells benötigen geschweifte Klammern. Mit den Runden Klammern wird ein DOUBLE Array erzeugt und die Fehlermeldung kommt daher, dass man den Vektor auf der rechten Seite nicht in ein einzelnes Element auf der linken Seite schreiben kann.

Code:

name{1} = 'Dateiname1';
name{2} = 'Dateiname2';
name{3} = 'Dateiname3';
name{4} = 'Dateiname4';

namen = cell(1, 4);   % Pre-allocate
for i=1:4
  namen{i} = name{i};
end

Obwohl dann "name" und "namen" eigentlich identisch sind, sodass "namen=name" gereicht hätte. Zur Not, aber nur dann, könnte rechts auch das EVAL stehen bleiben.

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

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 22.12.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.02.2013, 23:54     Titel:
  Antworten mit Zitat      
Ok vielen Dank! So funktionierts.
Wofür brauche ich eigentlich die Pre-allocation? Ohne scheints auch nicht langsamer zu gehen.
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: 28.02.2013, 10:08     Titel:
  Antworten mit Zitat      
Hallo MoTSCHIGGE,

Bei 4 Elementen ist eine Pre-allocation nicht messbar schneller. Aber es lohnt sich von vornherein einen sauberen Programmierstil zu verwenden, weil das Gehirn das am besten lernt, was es immer wieder trainiert.

Wenn man statt 4 z.B. 100'000 Elemente in ein Array schreibt, muss bei jedem Anhängen eines Elements zunächst ein gesamter neuer Block im Speicher allozioert werden, dann werden die alten Daten kopiert und das neue Element angefügt. Bei einem [1 x 100000] Array vom Typ DOUBLE fordert man insgesamt SUM(1:100000)*8 Bytes vom Betriebssystem an und kopiert ebensoviele Bytes. Und das sind 5'000'050'000, also mehr als 5 GigaByte. Und das bemerkt man schon in der Laufzeit, obwohl die modernsten Matlab Versionen versuchen, das Problem abzudämpfen (wohl indem sie provisorisch mehr Speicher reservieren als benötigt). Zwar wirde der Speicher immer wieder freigegeben, aber bevor er wiederverwendet werden kann, muss er zunächst mit Nullen überschrieben werden.
Deshalb die einfache Regel: Alle Arrays werden pre-alloziert.

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

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 22.12.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.02.2013, 10:30     Titel:
  Antworten mit Zitat      
Vielen Dank für die ausführliche Antwort! Genau das wollte ich wissen.
Grüße
Daniel
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.