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:
clearall;
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
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.
_________________
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...
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
_________________
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?
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:
clearall;
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
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?
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.
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:
clearall;
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...
[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
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.
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.
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
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.