Matlab Lesen in der txt Datei in ein array
Ich habe eine text-Datei mit dem folgenden format der Angaben:
Name1 34 25 36 46
Name1 23 53 15 86
Name1 25 25 87 35
Name2 76 22 44 55
Name2 88 88 88 88
Name3 11 11 11 11
Name3 55 66 88 88
Name3 88 88 88 88
Name3 00 00 00 00
Gibt es verschiedene "Namen" und ich hab ordnen Sie die einzelnen Namen in einem array-slot. Ich würde dann einen anderen Weg brauchen, reservieren Sie das Datum im Zusammenhang mit jeder Zeile, dass bestimmte Stelle. So zum Beispiel die erste Name1 haben kann-array{0}, aber ich würde auch die Notwendigkeit zu verknüpfen, 34, 24, 36 und 46 irgendwie. Ich würde auch die Notwendigkeit der Unterscheidung der verschiedenen Namen von einander. Was ist der beste Weg, dies zu tun? ein 2x2-array scheint nicht die Lösung zu sein.
Was ich habe, so weit ist etwas entlang der Linien von:
%# read the whole file to a temporary cell array
fid = fopen(filename,'rt');
tmp = textscan(fid,'%s','Delimiter','\n');
fclose(fid);
%# remove the lines starting with headerline
tmp = tmp{1};
idx = cellfun(@(x) strcmp(x(1:10),'headerline'), tmp);
tmp(idx) = [];
%# split and concatenate the rest
result = regexp(tmp,' ','split');
result = cat(1,result{:});
%# delete temporary array (if you want)
clear tmp
Courtesy: Lesen Sie txt-Datei in Matlab
Könnte mir bitte jemand sagen, der beste Weg, um ordnen Sie die Informationen? Danke, Hilfe ist sehr willkommen.
InformationsquelleAutor intl | 2012-09-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ausgehend von dem code, warum nutzen Sie nicht
textscan
verwendet Leerzeichen und Zeilenvorschub als Trennzeichen standardmäßig. Wenn Sie geben newline als Trennzeichen explizit, verlieren Sie das Leerzeichen als Trennzeichen, und die Portabilität (Windows oft verwendet\r\n
als Einzel-newline, in der Erwägung, dass Unix abgeleitete Betriebssysteme verwenden\n
). So, da Ihre Daten, lassen Sie ihn einfach aus.Dann springen Sie durch Reifen zu entfernen 10 headerlines, während
textscan
hat bereits ein schönes gebacken-in option für. So, diese Schritte sind nicht erforderlich. Sie gehen durch die Spaltung der Zeug durch einen pass durchregexp
mit einem Leerzeichen als Trennzeichen, aber datextscan
schon spaltet auf Raum, das ist auch nicht notwendig.So, die drei Zeilen oben, erhalten Sie
Nun, nun, die Daten zu speichern bequemer. Ich kann mir denken, zwei Möglichkeiten:
Für beide, Sie werden haben zu finden, die eindeutigen Namen zuerst:
Verwendung von cell-arrays
Dadurch erhalten Sie einen cell-array mit den Daten, sortiert nach name:
Nun können Sie den index in
results
wie folgt:Denken Sie daran, dass Matlab ist 1-basiert, so dass
a(3)
zeigt das 3. element dera
, nicht den 4. Rang.Aufschlüsselung der Befehl:
Die Funktion
arrayfun
durchläuft die Elemente des Eingabe-Arrays, wendet eine Funktion auf jedes element, und speichert die Ergebnisse entweder in einem regelmäßigen array (wenn möglich) oder in einem cell-array (wenn nicht möglich (Fehler) und, wenn gegeben'uniformoutput', false
). Es ist ein bisschen wie einforeach
-Konstrukt.Wobei die Eingabe-array gleich der einzigartige
names
gefunden, im ersten Schritt, der trick ist die Funktion gelten für die einzelnen Namen. Die Funktion@(x) data(strcmp(tmp{1},x),:)
findet zuerst die Indizes für die der angegebene Namen intmp{1}
(array mit allen Namen) mitstrcmp
. Diese Indizes werden dann verwendet, um den indexdata = [tmp{2:end}]
, d.h., alle anderen arrays.Die Ergebnisse für jede einzelne eindeutige name wird dann gespeichert in der Zelle-array
results
.Mit Strukturen
Können Sie einen Schritt weiter gehen und verwenden Sie das cell-array
results
um eine besser lesbare-Daten-Struktur. Nach der Anwendung aller vorhergehenden Schritte ausführen:Nun können Sie die Referenz auf Ihre Daten, von name:
Die syntax
your_struct.('someString')
heißt dynamische Struktur verweisen auf. Es verweist oder erstellt ein Feld in der Strukturyour_struc
genanntsomeString
.Nun, wenn
names{ii}
Unterstrich enthält, die Sie loswerden möchten, dann können Sie festlegen,oder
für Räume. Dann nutzen Sie
Großes Lob an diese Jungs für, die letzten.
Könnten Sie Strukturen oder Zellen. Siehe mein edit
InformationsquelleAutor Rody Oldenhuis
Zunächst sollten Sie auf jeden Fall Lesen Sie die Daten mit der Methode vorgeschlagen, die von Rody (+1 für Rody für den Hinweis es aus), so werde ich davon ausgehen, dass Sie bekam, dass weit und haben eine variable namens tmp wie in Rody code-Beispiel.
Nun, wenn ich verstehe, das problem korrekt funktioniert, müssen Sie in der Lage zu unterscheiden, die jede Zeile von deinem Beispiel-dataset von den anderen Zeilen (mit Datum?) aber zur gleichen Zeit, die Sie auch brauchen, um leicht unterscheiden die verschiedenen Namen, die das gleiche über mehrere Zeilen (nochmals, ich bin immer von Ihrem Beispiel-dataset).
Eine Möglichkeit, dies zu erreichen (das ist zwar ein Nachteil) ist, eine Struktur zu verwenden. Ich nehme an, Sie haben die variable tmp, in Rody Antwort, und wir werden von dort aus zu gehen. Verwenden Sie den code:
Dieser code erstellt eine Struktur, bei der die erste Ebene in der Struktur besitzt einen Feldnamen für jede eindeutigen Namen in das dataset (habe ich auch in den code die variable
NameVec
in der ersten Ebene der Struktur, so kann es verwendet werden, zum verweisen auf die verschiedenen Felder, die später mit einer Schleife). Dann in jedes Feld (Name1, Name2 und Name3 in diesem Beispiel), ich habe gespeichert eine Daten-matrix enthält die Daten, die im Zusammenhang mit diesem Namen (wo die einzelnen Zeilen sind erhalten).Der Nachteil dieses Ansatzes ist, dass, wenn Sie wollen, um ALLE Daten wieder in einem großen array, werden Sie brauchen, um eine Schleife über die Elemente der Struct.NameVec und abrufen der Daten-matrix in Verbindung mit jeweils eindeutigen Namen. Und Schleifen sind langsam in matlab. Also wirklich, es hängt wie Sie planen, die Daten nutzen zu können.
Hoffe, das hilft!
ps, wenn Sie nicht vertraut mit der matlab-Strukturen, die diesen code ausführen:
und führen Sie dann den code, den ich oben auf
tmp
. Dann haben Sie einen Blick auf die resultierende Struktur nenntStruct
in der matlab-variable editor. Dies sollte Ihnen ein Gefühl dafür, wie Sie funktionieren.InformationsquelleAutor Colin T Bowers