Verfasst am: 21.10.2014, 01:29
Titel: Einlesen von mehreren Textdateien, 3D Matrix
Hallo liebe Matlab Gemeinde,
ich kämpfe gerade mit einem Problem mit einer Menge an Messdaten. Die Daten eines Versuchs sind in einer Textdatei gespeichert, beim Einlesen kommt dann etwa eine 700x500 Matrix aus raus, quasi Pixel. Ich möchte jedoch 10 Versuche auf einmal einlesen um dann eine 3D Matrix zu erhalten, also 700x500x10.
Über die 10 Versuche möchte ich dann für jeden Pixel ein paar Werte wie StdAbweichung ect berechnen. Ist da mein Gedankengang richtig oder gibts da eine einfachere Möglichkeit die Daten einzulesen und zu bearbeiten? Bisher hab ich leider keinen Code rausbekommen der funktioniert.
files=dir('*.dat'); % Liste aller .dat-Dateien im Verzeichnis anlegen
kmax=numel(files); % Wie viele sind es?
data=cell(kmax,1); % Entsprechend grosse Cell anlegen for k=1:kmax
fid=fopen(files(k).name,'rt'); % k-te Datei oeffnen
temp=textscan(fid,'%n %*n %*n %*n %n %*[^\n]',...
'HeaderLines',1); % Erste Spalte einlesen, 2., 3. und 4. % ignorieren, 5. Spalte einlesen, Rest bis zum Zeilenende % ignorieren, 1. Zeile (Spaltenueberschriften) ignorieren fclose(fid); % k-te Datei wieder schliessen
data{k,1}=[temp{:}]; % Dateiinhalt speichern % oder hier wie auch immer dirket auswerten end
data{3}(10,2)% 3.Datei, Zeile 10, Spalte 2
% z.B. beide Spalten jeder Datei gegeneinander in einem Plot darstellen holdall for k=1:kmax
plot(data{k}(:,1),data{k}(:,2));
end hold off
es wäre gut, wenn du beschreibst was genau denn jetzt nicht funktioniert. Anscheinend hast du schon ein Code und das Einlesen der Daten sieht soweit richtig aus. Woran scheitert es?
Also wie gesagt habe ich den Code gefunden, der denke ich zu meinem Problem passt. Jedoch kann ich den Part hier denke ich weglassen, da alle Messdaten eingelesen werden sollen. Bin mir nur nicht sicher, was dann stattdessen dahin gehört:
der zweite Parameter beschreibt das Format der eingelesen Dateien.
Je nach Anzahl der Spalten in deiner einzulesenden Datei musst du den String zu '%f%f%f...Anzahl derSpalten' setzen. HeaderLines kann man weglassen sofern du keine Beschreibung der Spalten in den Dateien hast.
Die Hilfe hab ich mir schon mehrmals angesehen, aber bin da noch nicht durchgestiegen. Heisst das, ich müsste für 700 Spalten 700x %f angeben? Ich habe manchmal auch Messdaten, die eine andere Anzahl an Spalten haben und würde das gerne unabhängig von einem festen Wert programmieren.
So, ich habe nun etwas herumgebastelt und mit dem Code hier funktioniert es ganz gut. is zwar etwas lahm aufgrund der Datenmenge und der Schleife, aber das ist nicht so wichtig.
Was jetzt noch ganz schön wäre, wenn mal eine kleinere Matrix eingelesen wird als die 481x751 Pixel, dass die mittig in der Matrix ausgerichtet wird, in der sie reingeschrieben wird, also in X. Hat da jemand eine Idee, wie ich das machen könnte? Im Code müsste ich das hier einbauen:
Beispielsweise wenn die Messdaten nur 381x751 Pixel sind, dass die Matrix N in X um 50 Pixel verschoben wird.
Code:
dirname =uigetdir('F:\Matlab\Neuer Ordner'); % Ordner der Versuchsdaten eingeben,
files=dir(fullfile(dirname,'*.txt')); % Liste aller .txt-Dateien im Verzeichnis anlegen
kmax=numel(files); % Wie viele sind es?
sizeX = size(X); %größe der Matrix auslesen
n = sizeX(1); % Zeilen
m = sizeX(2); % Spalten
for kk=1:kmax
filename = fullfile(dirname,files(kk).name);
fid=fopen(filename,'rt'); % k-te Datei oeffnen
comma2point_overwrite(filename);
N = dlmread(filename,'\t'); % Messdaten eines Versuchs einlesen
sizeN = size(N);
shiftN = sizeX(1:2)-sizeN; % berechnet den Größenunterschied der Matrizen
X(:,:,kk) = N; % 3D Ergebnismatrix fclose(fid); % k-te Datei wieder schliessen % oder hier wie auch immer dirket auswerten end
files=dir(fullfile(dirname,'*.txt')); % Liste aller .txt-Dateien im Verzeichnis anlegen
kmax=numel(files); % Wie viele sind es?
X = zeros(481,751,kmax); % 3D Matrix anlegen, 481x751 = Anzahl der Pixel
sizeX = size(X); % Größe der Matrix auslesen
n = sizeX(1); % Zeilen
m = sizeX(2); % Spalten
for kk=1:kmax
filename = fullfile(dirname,files(kk).name);
fid=fopen(filename,'rt'); % k-te Datei oeffnen
comma2point_overwrite(filename); % überschreibt alle Kommas mit Punkt
star2zero_overwrite(filename); % überschreibt alle Sternchen mit Nullen
N = dlmread(filename,'\t');
sizeN = size(N);% größe der Matrix auslesen
shiftN = (sizeX(1:2)-sizeN)/2; % die Verschiebung beträgt die Hälfte der Differenz von X&N
shift_floor=floor(shiftN); % abrunden
shift_ceil=ceil(shiftN); % aufrunden
X(1+shift_floor(1):sizeX-shift_ceil(1),1+shift_floor(2):sizeX(2)-shift_ceil(2),kk)=N;
% fügt die Messdaten zentriert in die Ergebnismatrix ein fclose(fid); % k-te Datei wieder schliessen end
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.