2 Stimmen

Lesen der dat-Datei in eine Matrix in MATLAB mit unterschiedlichen Mengen von Daten in jeder Zeile

Ich versuche eine Matlab-Funktion zu schreiben, die Daten in eine Matrix lädt. Das Problem ist, dass die Daten in jeder Zeile einen Wert mehr haben. Daher kann ich load leider nicht verwenden und versuche es stattdessen mit fgetl.

Die Daten sehen so aus:

143234
454323 354654
543223 343223 325465

etc

Was ich gemacht habe, ist eine Matrix mit Nullen zu erstellen, deren Dimensionen die Höhe und die Länge der längsten Datenzeichenfolge sind. Um die Daten in die Matrix zu setzen, habe ich fgetl verwendet, um jede Zeile zu lesen, und dann textscan, um die Daten an Leerzeichen zu trennen. Dann habe ich str2num verwendet (hier denke ich liegt der Fehler), um die Zeichenfolge in eine Zahl umzuwandeln.

Hier ist mein Code:

%READTRI Öffnet die Dreiecks-Datendatei und wandelt sie in eine Matrix um

fid = fopen('triangledata.dat');

%erstelle eine Matrix mit Nullen, um die abgerufenen Daten einzufügen
trimat = zeros(15,15);

%Überprüfen, ob die Datei ordnungsgemäß geladen wurde
if fid == -1
disp('Fehler beim Laden der Datei')
else
%wenn ja, fortfahren

%lese jede Datenzeile in a
while feof(fid) == 0

    %zeilenweise durchlaufen
    aline = fgetl(fid);

    %aline in Teile an Leerzeichen aufteilen
    splitstr = textscan(aline,'%s','delimiter',' ');

    %Dies bestimmt in welche Zeile der Matrix die for-Schleife schreibt
    rowCount = 1;

    %durchlaufe die Zellmatrix, um die Zahlen zu erhalten und in die Matrix zu schreiben
    for i = 1:length(splitstr)

        %in Zahl umwandeln
        num = str2num(splitstr{i});

        %Zahl in Matrix schreiben
        trimat(rowCount, i) = num;

    end

    %rowCount erhöhen
    rowCount = rowCount + 1;
end
%Datei schließen
closeresult = fclose(fid);

%auf Fehler überprüfen
if closeresult == 0
    disp('Datei erfolgreich geschlossen')
else
    disp('Datei konnte nicht geschlossen werden')
end
end

end

Der Fehler, den ich erhalte, ist:

Fehler bei der Verwendung von str2num (Zeile 33)
Eingabe erfordert eine Zeichenfolge oder Zeichenfolgenarray.

Fehler in readTri (Zeile 32)
        num = str2num(splitstr{i});

Was mich stört ist, dass wenn ich im interaktiven Konsolenfenster dasselbe mache, was in der Schleife passiert, d.h. aline importiere, sie in eine Zellmatrix mit textscan aufteile und dann num2str verwende, um sie in eine ganze Zahl umzuwandeln, alles funktioniert. Entweder ist die Art und Weise, wie ich num2str verwende, falsch oder die for-Schleife macht etwas Seltsames.

Ich hoffte nur auf Ideen, es gibt VIEL Daten, daher ist es nicht möglich, Nullen hinzuzufügen, damit load funktioniert.

Vielen Dank fürs Lesen!

5voto

lhcgeneva Punkte 1981

Sie können dlmread anstelle von load oder fgetl verwenden. Es gibt automatisch eine Matrix mit Nullen zurück, wann immer die Zeile nicht so lang ist wie die längste. Einfach machen

matrix = dlmread('triangledata.dat');

2voto

marsei Punkte 7651

Warum nicht textscan verwenden?

fid = fopen('test.txt','r');
C = textscan(fid, '%f%f%f');
fclose(fid);

res = cell2mat(C)

Das Ergebnis ist

res =

  143234         NaN         NaN
  454323      354654         NaN
  543223      343223      325465

wo fehlende Werte NaN sind.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X