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

Mehrer Dateien Einlesen und Werte verarbeiten

 

retsam
Forum-Century

Forum-Century


Beiträge: 112
Anmeldedatum: 23.09.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.09.2013, 14:43     Titel: Mehrer Dateien Einlesen und Werte verarbeiten
  Antworten mit Zitat      
Hallo Zusammen,
ich bin neu auf dem Gebiet MatLab und habe schon einiges hilfreiches hier im Forum gefunden.
Leider komme ich trotzdem nicht weiter.
Ich habe hier:
http://www.gomatlab.de/mehrer-datei.....-variablenname-t4311.html
sowie hier
http://matheplanet.com/default3.htm.....%3A%2F%2Fwww.google.de%2F
ein vergleichbares Thema gefunden.
Selbst mit der sehr guten Hilfe auf Matlab komme ich nicht weiter.

Problem:
Ich habe mehrere Dateien die ich gerne einlesen möchte. Die Erste Zeile spiegelt dabei immer den gefahrene Weg wieder die zweite Zeile den Wert.
Nun möchte ich das alle Zeilen sowie Spalten eingelesen werden, was auch klappt, allerdings irgendwie verrutschen so dass ich anstelle von 4 Spalten 6 habe.
Danach würde ich gern die Koordinaten x mit y1,y2....yn verknüpfen und plotten.
Folgenden Code habe ich dazu schon geschrieben:
Code:

clear all;
clc;
dateien = uigetfile('*.asc', 'Choose File', 'C\Mat-Lab', 'MultiSelect', 'on');
%liste = dir(path);
for i = 1:length(dateien)
   daten{i}=dlmread(dateien{i}, ' ', 1, 0);
   %plot(daten{i}(:,1),daten{i}(:,2));
end
for i = 1:length(dateien)
    x{i}=daten(:,1); %x Zeitabhängig, ((:,1) alle Zeilen, Spalte 1)
    z{i}=daten(:,2);
,((:,1) alle Zeilen, Spalte 2)...
end
 

...Ich bekomme hierbei allerdings immer den Fehler:
Variable appers to change size on every loop...
Habe ich ein Skriptfehler, oder einfach nur falsch gedacht..

Über Antworten würde ich mich freuen.

Greetz

Zuletzt bearbeitet von retsam am 23.09.2013, 14:50, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen


Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 23.09.2013, 14:48     Titel:
  Antworten mit Zitat      
Zitat:
Variable appers to change size on every loop...

das ist kein fehler sondern ein hinweis auf die fehlende preallokation des wertes was zu laufzeiteinbußen führt.
ohne eine beispieldatei ist es schwer den fehler mit den anzahlen der spalten nachzuvollzihen.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
retsam
Themenstarter

Forum-Century

Forum-Century


Beiträge: 112
Anmeldedatum: 23.09.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.09.2013, 15:04     Titel:
  Antworten mit Zitat      
Hallo,
entschuldige bitte. Die wollte ich doch noch mit hochladen,
Siehe Anhang...
Diese Datei möchte ich n-mal öffnen können und hinterher Plotten.
Dabei hat y an der Stelle x immer einen anderen Wert ähnlich einer 1:n Beziehung...

Herzlichen Dank

Beispiel 1.txt
 Beschreibung:

Download
 Dateiname:  Beispiel 1.txt
 Dateigröße:  116.44 KB
 Heruntergeladen:  624 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 23.09.2013, 15:30     Titel:
  Antworten mit Zitat      
für so einfache sateien würd ich glaube ich lieber textscan oder textread nehmen um die daten einzulesen. du hast außerdem nicht nur 1 lehrzeichen als trennungszeichen sondern 3
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
retsam
Themenstarter

Forum-Century

Forum-Century


Beiträge: 112
Anmeldedatum: 23.09.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.09.2013, 17:45     Titel:
  Antworten mit Zitat      
Hallo,
danke für die Rückmeldung.
Das heißt mit Textscan sollte es klappen?
Wie genau lese ich denn drei-leertzeichen ein?
Das sind nur die ersten 20 Werte, danach verspringt das Leerzeichen?
Gibt es eine Ordentliche Doku?

Herzlichen Dank & Greetz
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 23.09.2013, 17:59     Titel:
  Antworten mit Zitat      
Code:
[filename,filepath] = uigetfile('*.txt', 'Choose File', 'I:\MatLab', 'MultiSelect', 'on');

daten=cell(1,numel(filename));
for i = 1:length(dateien)
   fid=fopen(fullfile(filepath,filename{i}));
   daten{i}=textscan(fid,'%f %f');
fclose(fid);
end

so zb
edit: hatte flcose vergessen
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
retsam
Themenstarter

Forum-Century

Forum-Century


Beiträge: 112
Anmeldedatum: 23.09.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.10.2013, 12:26     Titel:
  Antworten mit Zitat      
Guten Morgen,
erst mal herzlichen Dank für die schnelle Antwort und Entschuldigung für die späte Rückmeldung, ich habe es leider vorher nicht geschafft.
Nochmals zurück zur Ausgangssituation:
Ich habe nun folgenden Quellcode:
Code:
clear all;
dateien = uigetfile('*txt', 'Choose File', 'MultiSelect', 'on'); % öffnen der Textdateien
for i = 1:length(dateien)
   daten{i}=dlmread(dateien{i}, ' ', 1, 0);
end


Hierbei kann ich alle markierten Dateien einlesen, welche auch in einer Variablen mit einem Wert gespeichert wird. Hier drunter befindet sich verschachtelt die Matrix mit 6 Spalten. Dies ist an dieser stelle nicht gewünscht. Ich hätte gern direkt die Matrix mit 6 Spalten ohne verrutschen der Werte.

Wenn ich folgenden Code nutzte:

Code:
%dateien = dlmread(dateien); % auslesen der Dateien    
%x=(dateien(:,1)); %auslesen der x -werte
%y=(dateien(:,2)); % auslesen der y-werte
%plot(x,y); %darstellen der x,y diagramm

Dann habe ich auch keine Probleme mit dem Verspringen der Werte und alles wird in einer zwei Zeiligen Matrix gespeichert.

Nun meine Frage:
Wie kann ich mehrere Dateien einlesen und diese in einer Matrix speichern ohne Zeilen Versprung?

Herzlichen Dank ...


P.S. Empfehlungen für Lesestoff wäre klasse.


Herzlichen Dank und Greetz
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.2013, 12:58     Titel:
  Antworten mit Zitat      
Hallo

Gebe bei Delimiter unbestimmte Anzahl der Leerzeichen durch ein Stern Zeichen.

so,
Code:
dateien = uigetfile('*txt', 'Choose File', 'MultiSelect', 'on'); % öffnen der Textdateien
for i = 1:length(dateien)
   daten{i}=dlmread(dateien{i}, '\s* ', 1, 0);
end
Private Nachricht senden Benutzer-Profile anzeigen
 
retsam
Themenstarter

Forum-Century

Forum-Century


Beiträge: 112
Anmeldedatum: 23.09.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.10.2013, 11:31     Titel:
  Antworten mit Zitat      
Hallo und nochmals vielen lieben dank.
Ich sitze immer noch am Problem das ich die Textdateien nicht eingelesen bekomme.
Ich habe das Gefühl, das die Daten der eingelesenen Dateien sich immer wieder überschreiben.
Ich würde gern die im ersten Beitrag angehängte Datei (es sind mehrere vorhanden) mehrfach einlesen und die Spalten auch in unterschiedliche Spalten geschrieben werden.
Könnte mir vielleicht jemand nochmals helfen?

Herzlichen Dank und Greetz
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 09.10.2013, 12:32     Titel:
  Antworten mit Zitat      
Hallo

wie können die Dateien sich überschreiben, wenn du diese nur einliest?

Zitat:

Ich würde gern die im ersten Beitrag angehängte Datei (es sind mehrere vorhanden) mehrfach einlesen und die Spalten auch in unterschiedliche Spalten geschrieben werden.


Das ist mir nicht klar bitte an einem Beispiel erklären.
Private Nachricht senden Benutzer-Profile anzeigen
 
retsam
Themenstarter

Forum-Century

Forum-Century


Beiträge: 112
Anmeldedatum: 23.09.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.10.2013, 12:33     Titel:
  Antworten mit Zitat      
Hallo,
herzlichen Dank, dass du dir die Zeit nimmst.
Ich habe mehrere Dateien in einem Ordner, welche ich gerne einlesen will.
In diesen Dateien sind jeweils zwei Spalten,welche nacheinander in eine Matrix geschrieben werden sollen.
Das heißt je Datei zwei Spalten
4 Dateien = 8 Spalten Matrix. (Variable je nach Anzahl der eingelesenen Dateien)

Ich bin beizeiten soweit, dass ich anstelle des DLMread den load Befehl verwende. Die For schleife läuft auch durch, allerdings werden die Werte die mittels Cat an die Matrix angehängt werden solle nicht übergeben.

Derzeitiger Code:
Code:

clear all;
dateien = uigetfile('*.txt', 'Auswählen der Dateien', 'MultiSelect', 'on'); %öffne die Dateien
if ~iscell(dateien) %wenn nur eine Datein ausgewält wurde setzte Zähler auf eins.
   dateien={dateien};
end %Ende der Schleife
zaehler = numel(dateien); %Zähle die Anzahl der geöffneten Dateien
for i = 1:zaehler;%Schleife durchlaufen bis Anzahl Dateien erreicht
    daten(i) = load(dateien(i));% Lade die Dateien nacheinander
    cat(2,daten)% Anhängen der Daten an die Matrix
end
 



Ich hoffe das Ihr mich versteht und hoffe das ich mir vll. etwas auf die Sprünge helfen könnt.
Ich habe leider das gefühl das mit etwas "fehlt"..
Kann es eventuell am relativen Pfad liegen...

Greetz und Thx..
Ret
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 10.10.2013, 12:43     Titel:
  Antworten mit Zitat      
Hallo

verstehe jetzt dich besser.
versuch folgendes:
Code:


[dateien, pfad] = uigetfile('*.txt', 'Auswählen der Dateien', 'MultiSelect', 'on'); % öffne die Dateien
if ~iscell(dateien) % wenn nur eine Datein ausgewält wurde setzte Zähler auf eins.
   dateien = {dateien};
end % Ende der Schleife

zaehler = numel(dateien); % Zähle die Anzahl der geöffneten Dateien
daten =cell(1, zaehler); % speicher platz reservieren
for i = 1 : zaehler;% Schleife durchlaufen bis Anzahl Dateien erreicht
    daten{i} = load(fullfile(pfad, dateien{i})); % Lade die Dateien nacheinander
   
end

Matrix = cat(2,daten{:})% Anhängen der Daten an die Matrix

 
Private Nachricht senden Benutzer-Profile anzeigen
 
retsam
Themenstarter

Forum-Century

Forum-Century


Beiträge: 112
Anmeldedatum: 23.09.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.10.2013, 13:10     Titel:
  Antworten mit Zitat      
Hallo,
also mit diesem Quelltext hat es geklappt.
Ich frage mich nur wieso?
Gibt es hierfür vielleicht eine Anfänger freundliche Erklärung?

Ich habe den Beitrag auf gelöst gesetzt.

Greetz und Danke

Ret
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



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

Du sollst immer versuchen dein Problem auf ganz kleine Teilprobleme aufzuteilen, dann wird das Programmieren dadurch viel einfacher
z.B

1) Dateien auswählen => hast du ja richtig gemacht mit uigetfile
Vergesse aber den Pfad nicht, denn braucht man, sonst findet später der LOAD-Befehl diese Dateien nicht.

2) Auswahl prüfen => hier sollst du noch prüfen, falls der Benutzer das Abbrechen wählt. Dann ist die Dateien gleich 0.
Schau dazu in die Doku zu UIGETFILE, da steht ein Beispiel dazu

3) Daten laden => in FOR-Loop die Werte z.B in Cell zuerst ablegen
Hier habe ich FULLFILE genutzt, um den vollen Pfad zur Datei zusammenzusetzen, sonst würde der LOAD-Befehl diese Dateien nicht finden.
Außerdem deine Dateien sind Strings in einem Cell, also Cell. Um auf den Inhalt der Cell zuzugreifen, braucht man geschweifte Klammern {}.
Bei Runden bekommt man wieder eine Cell zurück. Das würde weder LOAD noch FULLFILE verstehen, beide wohlen einen String haben.

Noch einen Fehler hast du bei der Zuweisung gemacht
daten(i) = load(...).
Du sagst ja das die Textfiles 2 Spalten Matrix enthalten. Da du die Variable daten zuvor nicht definiert hast, wird daten(i) als ein Vektor von Matlab angenommen. Jetzt versuchst du sagen 2 Werte, an eine Stelle zu schreiben, was schlicht unmöglich ist.
Kannst ja z.B sowas versuchen, man bekommt gleich eine Fehlermeldung, dass Anzahl der Elemente nicht stimmt.
A(1) =[2, 3 ]

4) Daten zusammensetzen => Die Funktion CAT ist richtig, aber hier nochmal in die Doku schauen.

Ich extrahiere hier die Cell daten{:}, in dieser Cell haben wir vorher die Matrizen abgelegt, also werden dem CAT viele Matrizen übergeben, das entspricht der Notation in der Doku: cat(2,Mat1, Mat2, Mat3...)

Du versuchst in Schritt 3) gleich zwei Teilprobleme zu lösen das steigert natürlich deine Komplexität. Besser Teilprobleme nacheinander zu lösen.
Außerdem solltest du nach jedem gelösten Teilproblem dein Code testen, denn wg Fehler in letztem Block, wird die Fehlersuche für nächsten Block schwieriger.
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: 10.10.2013, 14:53     Titel:
  Antworten mit Zitat      
Hallo retsam,

Eine freundliche Erklärung für welche Frage?

In Deinem Code steht:
Code:
daten(i) = load(dateien(i));% Lade die Dateien nacheinander
cat(2,daten)% Anhängen der Daten an die Matrix

Dies enthält ein paar Bugs:
1. "dateien" ist ein Cell String. Dann ist "dateien(i)" ebenfalls ein Cell String, allerdings mit der Länge 1. Du möchtest aber den enthaltenen String, also "dateien{i}" mit geschweiften Klammern.
2. "daten(i)" ist ein Skalar, hat also die Länge 1. "load()" liefert aber wohl mehr Daten, oder?
3. In UIGETFILE kann man die Daten auch in einem anderen Ordner aussuchen. Dieser andere Ordner sollte unbedingt als 2.ter Output erhalten werden und später die Datei-Namen per FULLFILE mit diesem Pfad definiert qwerden (siehe denny's Code).
4. "cat(2, daten)" fügt das Array "daten" entlang der zweiten Dimension zusammen, und zwar mit gar nichts. Die Ausgabe davon wird keiner anderen Variablen zugewiesen, es passiert also gar nichts und das wird gar nicht gespeichert.

Nebenbei empfehle ich "clear all;" unbedingt wegzulassen. Das löscht neben den Variablen auch alle Funktionen aus dem Speicher. Das Nachladen von der Festplatte vertrödelt unnötig Zeit. Ausserdem werden noch alle Breakpoints des Debuggers gelöscht. Und alles, was das Debuggen erschwert ist ein Feind des Programmierers.

Und? Hilft das weiter? Wenn nicht, frage doch nochmal konkret nach.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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.