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

ASCII import (nochmal), vertcat, cell2mat etc.

 

Olsen
Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 15.09.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.02.2011, 16:23     Titel: ASCII import (nochmal), vertcat, cell2mat etc.
  Antworten mit Zitat      
Hallo zusammen,

das Thema ist nicht neu. Dennoch würde ich es gern noch einmal aufgreifen.
Es geht in erster Linie um ASCII import mehrerer Dateien und das Schreiben in eine Matrix.
Die *asc files haben unterschiedlich viele Zeilen und immer 4 Spalten.
Zwei davon sind angehängt (insgesamt gibt es ziemlich viele davon).

Ascii import klappt so wunderbar:

Code:

list = dir('*.asc');

for i=1:length(list)
    eval(['load ' list(i).name ' -ascii']);
end
 


Nur liegen jetzt die Dateien in n arrays vor. Ich möchte einen langen array mit 4 Spalten.
Nun will ich natürlich nicht

Code:


schreiben bis ich schwarz werde. Wie indiziert man hier richtig um das in einer Schleife zu lösen.

Eine potentielle Alternative um das ganze in einem Schritt zu lösen, wurde bereits in einem anderem Beitrag gezeigt:

Code:

list=dir('*.asc');

names={list.name};
anzahl=length(names);

for i=1:1:anzahl
    C(:,:,i)=dlmread((names{i}),'');
end
 


Allerdings funktioniert das so nicht.
error(Subscripted assignment dimension mismatch)

Wurde der code hier nur falsch eingetippt? Und es muss lauten:

Code:

C{:,:,i}=dlmread((names{i}),'');
 


Dass funktioniert zumindest. Nur um auf mein Ergebnis (eine n x 4 Matrix) zu kommen muss ich dann den cell-array in eine Matrix umwandeln.

M=cell2mat(C) funktioniert nicht.
error(CAT arguments dimensions are not consistent)
Wie gehts richtig?

Alle Vorschläge sind willkommen - ich danke euch.
Grüße

ascii_Bsp.zip
 Beschreibung:

Download
 Dateiname:  ascii_Bsp.zip
 Dateigröße:  134.9 KB
 Heruntergeladen:  855 mal
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 01.02.2011, 21:20     Titel:
  Antworten mit Zitat      
Hallo,

die Variante
Code:
C(:, :, i)

kann logischerweise nur klappen, wenn alle Datensätze die gleiche Anzahl Zeilen haben. Wenn die Datensätze nur untereinandergeschrieben werden sollen, sollte folgendes gehen:

Code:
C = [];
for i=1:1:anzahl
    C = [C; dlmread((names{i}),'')];
end


Eine andere Alternative wäre:
Code:
C{i}=dlmread((names{i}),'');


... und dann am Ende
Code:


Sollte beides funktionieren.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
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: 02.02.2011, 00:13     Titel: Re: ASCII import (nochmal), vertcat, cell2mat etc.
  Antworten mit Zitat      
Hallo Olsen,

Haralds Antwort ist ja bereits umfassend.

Ich habe nur eine meiner kurzen Standardanmerkungen zu EVAL:
Code:
eval(['load ' list(i).name ' -ascii']);
% Besser:
Data = load(list(i).name, '-ascii');

Während das EVAL weggelassen wurde, weil es hier nur verwirrt, ist das Speichern der Ausgabe von LOAD viel sicherer.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 15.09.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.02.2011, 11:24     Titel:
  Antworten mit Zitat      
Ich danke euch beiden. Die Varianten funktionieren. Folgender Code läuft am schnellsten:

Code:

list=dir('*.asc');
names={list.name};
anzahl=length(names);

M = [];
for i=1:1:anzahl
    M{i}=dlmread((names{i}),'');
end

M = vertcat(M{:});
 


Jan, mit der EVAL-Zeile in der for-Schleife schreibe ich meine Dateien in einzelne arrays die dann auch so heißen wie die input-files.
Data = load(list(i).name, '-ascii') in der for-Schleife überschreibt mir in jedem Durchgang das "Data."
Leider dauert es bei mir wohl etwas länger mich mit der Matlab syntax vertraut zu machen. Sie birgt für mich Kuriositäten aus denen ich nicht schlau werde und die auch schwer in irgendwelchen Dokumentationen zu finden sind. Die Beispielsuche ist manchmal etwas mühsam.

z.B.

Code:

eval(['load ' list(i).name ' -ascii']);
eval(['load' list(i).name '-ascii']);
 


Die Leerzeichen innerhalb der Hochkommata sind offensichtlich essentiell. Wo ist sowas dokumentiert? Habt ihr da noch einen guten Tip?
Mit besten Grüßen
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 02.02.2011, 11:47     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Data = load(list(i).name, '-ascii') in der for-Schleife überschreibt mir in jedem Durchgang das "Data."

Dann musst du auch in die linke Seite irgendwie das i reinbringen, z.B.
Code:
Data{i} = load(list(i).name, '-ascii')


EVAL ist grundsätzlich problematisch, da eben schwer zu sehen ist, was MATLAB da eigentlich macht, und sollte deshalb nach Möglichkeit vermieden werden. Wenn du es aber schon nutzt, hilft folgender Trick: ersetze EVAL durch DISP und du siehst, was MATLAB genau auszuführen versucht; in dem Fall sieht das dann so aus:
Code:
disp(['load' list(i).name '-ascii']);
loadmyfile.txt-ascii

Dass MATLAB Probleme hat, diesen Befehl auszuführen, sollte nachvollziehbar sein. Dass die Leerzeichen hier notwendig sind, ist nicht explizit dokumentiert, aber: MATLAB führt den String, der als Argument an EVAL übergeben wird, als Befehl aus. Und wenn in dem String die Leerzeichen fehlen, fehlen sie also auch im Befehl. UndwennmanetwasganzohneLeerzeichenschreibt,siehtesmanchmaletwaskomischaus-auchfuerMATLAB Smile

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
_Peter_
Moderator

Moderator


Beiträge: 537
Anmeldedatum: 08.12.10
Wohnort: ---
Version: 7.10, 2010a
     Beitrag Verfasst am: 02.02.2011, 11:48     Titel:
  Antworten mit Zitat      
Hallo Olsen,
Zitat:

Data = load(list(i).name, '-ascii') in der for-Schleife überschreibt mir in jedem Durchgang das "Data."


Das könntest du ohne eval lösen, indem du die Werte in einem Struct beispielsweise ablegst.
Code:

Data.(list(i).name(1:end-4)) = load(list(i).name, '-ascii');
 


Auf die Werte kannst du dann zugreifen indem du auch den Dateinamen verwendest. Anhand deiner Beispieldateien wie folgt:
Code:

Data.E1;
 

_________________

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
 
Olsen
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 15.09.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.02.2011, 12:06     Titel:
  Antworten mit Zitat      
Nochmalsvielendankeuchallen - sieht doch gut aus Wink

Alles klaro - ich habe die message verstanden.


___________

Egal was die Frage ist: Die Antwort könnte
logische Indizierung beinhalten. Smile

tzz tzz
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: 02.02.2011, 12:10     Titel:
  Antworten mit Zitat      
Hallo Olsen,

EDIT: Ich habe so lange zum Schreiben gebraucht, dass einige Punkte längst von anderen beantwortet worden sind. Bitte die Redundanzen einfach ignorieren. Danke

Zitat:
Code:
eval(['load ' list(i).name ' -ascii']);
eval(['load' list(i).name '-ascii']);


Die Leerzeichen innerhalb der Hochkommata sind offensichtlich essentiell. Wo ist sowas dokumentiert?

Das ist gar nicht dokumentiert, da es ein Befehl ist, den sich ein User beliebig zusammenstellen kann. Zerlege doch den Befehl mal in seine Einzelteile:
Code:

a = list(i).name
   % a = String, Dateiname ohne Pfad, z.B. 'file.mat'
b = ['load ' a ' -ascii']
   % b = 'load file.mat -ascii'
eval(b)
   % Das führt den String in b als Befehl aus.

% Nun mit fehlenden Leerzeichen:
b2 = ['load' a '-ascii']
   % b = 'loadfile.mat-ascii'
% Das läßt sich nicht als Befehl ausführen!
 

Das ist einer der Gründe, warum EVAL mehr Verwirrung produziert, als dass es hilft Aufgaben zu lösen. Wenn man den Befehl gleich ohne EVAL formuliert, treten die Probleme erst gar nicht auf:
Code:
load(list(i).name, '-ascii');

Das macht nämlich genau das selbe, verwirrt aber weniger beim Lesen und man macht auch weniger leicht Fehler.
Aber EVAL kann auch völlig unerwartete Dinge ausführen, z.B. wenn der Dateiname zufällig irgendwo ein Semikolon enthält:
Code:
Str = 'FileName;!format C:'  % DON'T DO THIS AT HOME!
eval(['load ', Str])  % NICHT AUSFÜHREN!

Jetzt würde nämlich folgendes passieren:
Code:
load('FileName');
!format C:

Also würde mal eben überraschend Deine Festplatte formatiert werden --- falls Du mit einem völlig veralteten Windows arbeiten würdest und zudem unvporsichtigerweise als Admin angemeldet wärest. Ich poste hier mal kein wirklich funktionierendes Beispiel, aber es gibt unzählige Dinge, die EVAL beim Ausführend dazu bringen, unkontrolliert Dinge zu zerstören, die man eigentlich ganz gerne noch behalten möchte.

Es war reine Absicht, dass mein "Data=load" die Variablen nicht direkt in den WorkSpace läd, weil das ganz genau wie EVAL zu extrem schwierig zu debuggenden Problemen führen kann:
Code:
load('File.mat');
a = sin(1.0);

Schon gibnt es keine Methode mehr, um sicher vorherzusagen, welchen Wert [a] hat! Es könnte nämlich durchaus eine Variable Namens "sin" im MAT-File stehen, die nach LOAD die Funktion "sin" verdeckt. Das passiert überraschend oft mit dem Namen "max", den Anfänger schon mal gerne verwenden - solange, bis ihnen die Programme um die Ohren fliegen.
Wenn man aber die Ausgabe von LOAD in einer Variablen speichert, ist alles schön an seinem Platz:
Code:
Data = load(File.mat);
a = sin(1.0)   % Garantiert: 0.84147
disp(Data.sin)  % Falls die Variable "sin" existiert

Wenn man nun verschiedene Files laden möchte, sollte man das besser in einem Cell-Array speichern, oder als unterschiedliche Felder in einem Struct.

Die funktionelle Form der Befehle ist immer sicherer, weil die nicht-funktionelle Form (wie nennt man die offiziell) auf "intelligente" Weise interpretiert wird -- zu Deutsch: Es kann Blödsinn heraus kommen:
Code:
disp hallo, pi
>> hallo
ans = 3.1416
disp('hallo, pi')
>> hallo, pi

fullfile * *
>> '*\*'
% Matlab 2009a:
fullfile * p
>> Error: Not enough input arguments

% Aber mit Matlab 6.5:
>> '*\p'
 

Ich könnte nun hundert andere kuriose Beispiele posten, die dann auch noch je nach Matlab-Version unterschiedlich interpretiert werden. Aber ich fasse der Einfachheit halber zusammen:

EVAL, LOAD ohne Output und die nicht-funktionelle Form der Befehle beinhalten so viele Tücken, dass sie in einem zuverlässigen Programm nicht vorkommen sollten.

Und viele dutzend, eher viele hundert Anfänger habe das bereits erlebt und nach verblüffenden Schwierigkeiten in diesem und anderen Foren nach Hilfe gesucht.

Viel Spaß beim Programmieren in Matlab, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Olsen
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 15.09.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.02.2011, 21:15     Titel:
  Antworten mit Zitat      
Hallo Jan,

vielen Dank für deine Mühe mir das so ausführlich zu erläutern. Habe ja schon aus anderen Beiträgen entnommen, dass EVAL kritisch zu sehen ist.
Ich werde in Zukunft die Finger davon lassen.
Für manche Leute ist "...Spaß beim Programmieren..." ein Widerspruch in sich Wink Da ist wohl dranbleiben angesagt. Wenns läuft, ist es ja durchaus spaßig.

Grüße
Olsen
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: 03.02.2011, 13:33     Titel:
  Antworten mit Zitat      
Hallo Olsen,

Zitat:
vielen Dank für deine Mühe mir das so ausführlich zu erläutern.

Ich habe den Eindruck, wenn ich es einmal erkläre (oder einmal am Tag?), erspart es 10 Threads mit diesbezüglichen Fragen in der Zukunft und viele Stunden Grübelzeit bei den Programmierenden.

Zitat:
Für manche Leute ist "...Spaß beim Programmieren..." ein Widerspruch in sich

So fühlten sich die MathWorks-Programmierer, als sie nach einer langen Diskussionsnacht die Funktion WHY in die Toolboxen eingefügt haben:
Code:
why
why
why
...

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.