2016-08-09 5 views
0

ich eine Textdatei haben, suppose meinedatei.txt, dass speichert Gleitkommazahl in folgender Weise koordiniert:Matlab - mehrere Zeilen lesen, wo Anzahl von Linien bestimmt ist, aus einer Textdatei und Speichern in Matrix

53 
-464.000000 -20.000000 0.009000 
-464.000000 -17.000000 0.042000 
-464.000000 -13.000000 0.074000 
-464.000000 -11.000000 0.096000 
-464.000000 -8.000000 0.114000 
... 
... 
... 
42 
380.000000 193.000000 7.076000 
381.000000 190.000000 7.109000 
383.000000 186.000000 7.141000 
384.000000 184.000000 7.163000 
384.000000 183.000000 7.186000 
386.000000 179.000000 7.219000 
... 
... 
... 

Die erste Zeile gibt die Anzahl der Zeilen für den ersten Koordinatensatz an, gefolgt von diesen vielen Zeilen. und dann gibt es eine weitere ganze Zahl, die die Anzahl der Zeilen für den nächsten Satz von Koordinaten angibt.

, d. H. Die erste Zeile hat 53, also sind die nächsten 53 Zeilen der erste Satz von Koordinaten (endend bei Zeile 54). Dann hat die Linie 55 den Wert 42, also sind die nächsten 42 Linien der zweite Satz von Koordinaten.

Wie kann ich die Textdatei so lesen, dass ich 1. Zeile lese, und die nächsten 53 Zeilen gelesen und in Matrix gespeichert werden. Dann 42 lesen und die nächsten 42 Zeilen lesen und speichern? Die Textdatei ist so bis EOF.

Antwort

2

Sie könnte es tun mit Low-Level File I/O, wie folgt aus:

fid = fopen('myfile.txt', 'r'); 
matrix = {}; 
while ~feof(fid) 
    N = fscanf(fid, '%d\n', 1); 
    matrix{end + 1} = fscanf(fid, '%f\n', [3 N])'; 
end 
fclose(fid); 
+0

hallo, lief ich den Code und was passiert ist, dass die Zeilen in der Textdatei werden vertikal gespeichert. h. aus der obigen Textdatei wird die Matrix vertikal in Form von -464 gespeichert; -20; 0,009; -464; -17; 0,042; zusätzlich möchte ich Koordinaten speichern, die nach der Anzahl der Zeilen in einer separaten Matrix erscheinen. also zum Beispiel aus der Textdatei oben, sollten 2 Matrizen zurückgegeben werden, die die Koordinaten speichern –

+0

Ich habe meine Antwort bearbeitet, um das zu berücksichtigen. Nun ist "Matrix" ein Zellen-Array, das alle Matrizen enthält. –

0
fid = fopen('myfile.txt ', 'r'); 
ind = 1; 
mycell = {}; 
while ~feof(fid) 
    N = fscanf(fid, '%d\n', 1); 
    matrix = fscanf(fid, '%f\n', [3 N]); 
    matrix = transpose(matrix); 
    cell{ind} = matrix; 
    ind = ind + 1; 
end 
fclose(fid); 
+1

Vielen Dank für Ihren Beitrag, aber solch eine geringfügige Änderung von einer anderen Antwort sollte als Kommentar zu der anderen Antwort angezeigt werden, anstatt eine vollständige neue Antwort zu posten. – Hoki

+0

Die obige Antwort speichert jedoch nicht die verschiedenen Sätze von Koordinaten in einer anderen Matrix. Gibt es einen Weg dazu? –

+0

@Hoki sollte ich meine Antwort entfernen und im Kommentar der vorherigen Antwort posten? –

0

Meine zwei Cent:

function matrix_cells = import_coordinates(filename, startRow, endRow) 
%IMPORT_COORDINATES Import numeric data from a text file as a matrix. 
% MATRIX_CELLS = IMPORT_COORDINATES(FILENAME) Reads data from text file FILENAME 
% for the default selection and store it into the array of cells MATRIX_CELLS. 
% 
% MATRIX_CELLS = IMPORT_COORDINATES(FILENAME, STARTROW, ENDROW) Reads data from 
% rows STARTROW through ENDROW of text file FILENAME. 
% 
% Example: 
% matrix_cells = import_coordinates('coordinates.txt', 1, 15); 
% 
% See also TEXTSCAN. 

%% Initialize variables. 
delimiter = ' '; 
if nargin<=2 
    startRow = 1; 
    endRow = inf; 
end 

%% Format string for each line of text: 
% column1: double (%f) 
% column2: double (%f) 
% column3: double (%f) 
% For more information, see the TEXTSCAN documentation. 
formatSpec = '%f%f%f%[^\n\r]'; 

%% Open the text file. 
fileID = fopen(filename,'r'); 

%% Read columns of data according to format string. 
% This call is based on the structure of the file used to generate this 
% code. If an error occurs for a different file, try regenerating the code 
% from the Import Tool. 
dataArray = textscan(fileID, formatSpec, endRow(1)-startRow(1)+1, 'Delimiter', delimiter, 'MultipleDelimsAsOne', true, 'EmptyValue' ,NaN,'HeaderLines', startRow(1)-1, 'ReturnOnError', false); 
for block=2:length(startRow) 
    frewind(fileID); 
    dataArrayBlock = textscan(fileID, formatSpec, endRow(block)-startRow(block)+1, 'Delimiter', delimiter, 'MultipleDelimsAsOne', true, 'EmptyValue' ,NaN,'HeaderLines', startRow(block)-1, 'ReturnOnError', false); 
    for col=1:length(dataArray) 
     dataArray{col} = [dataArray{col};dataArrayBlock{col}]; 
    end 
end 

%% Close the text file. 
fclose(fileID); 

%% Post processing for unimportable data. 
% No unimportable data rules were applied during the import, so no post 
% processing code is included. To generate code which works for 
% unimportable data, select unimportable cells in a file and regenerate the 
% script. 

%% Create output variable 
matrix_temp = [dataArray{1:end-1}]; 

%% MY CONTRIBUTION ;) 
% find rows with nan values 
[i,~]=find(isnan(matrix_temp)); 
indexes=unique(i); 

%% Create output cell array 
matrix_cells=cell(numel(indexes),1); 

%% Fill cell array filtering out unuseful rows and parting original matrix 
for i=1:1:numel(indexes)-1 
    matrix_cells{i}=matrix_temp(indexes(i)+1:indexes(i+1)-1,:); 
end 
% Last matrix 
matrix_cells{end}=matrix_temp(indexes(end)+1:size(matrix_temp,1),:); 

Der erste Teil (Lesen und Import von Textdatei) dieser Funktion war von MATLAB automatisch generiert. Ich habe nur den Code hinzugefügt, um die Matrix zu teilen und in ein Zellenfeld zu speichern.

Ich nehme an, dass Koordinaten keine Nan-Werte enthalten; Außerdem überprüfe ich nicht die Konsistenz zwischen der angegebenen Anzahl von Zeilen und der tatsächlichen Anzahl für jeden Block.

Hier ein Beispiel; Im Folgenden wird die Datei coordinates.txt

5 
-464.000000 -20.000000 0.009000 
-464.000000 -17.000000 0.042000 
-464.000000 -13.000000 0.074000 
-464.000000 -11.000000 0.096000 
-464.000000 -8.000000 0.114000 
3 
380.000000 193.000000 7.076000 
381.000000 190.000000 7.109000 
383.000000 186.000000 7.141000 
2 
384.000000 184.000000 7.163000 
384.000000 183.000000 7.186000 
1 
386.000000 179.000000 7.219000 

excute die Funktion:

coordinate_matrices=import_coordinates('coordinates.txt') 

coordinate_matrices = 

    [5x3 double] 
    [3x3 double] 
    [2x3 double] 
    [1x3 double] 

Dies ist der Inhalt jeder Zelle:

>> coordinate_matrices{1} 

ans = 

-464.0000 -20.0000 0.0090 
-464.0000 -17.0000 0.0420 
-464.0000 -13.0000 0.0740 
-464.0000 -11.0000 0.0960 
-464.0000 -8.0000 0.1140 

>> coordinate_matrices{2} 

ans = 

    380.0000 193.0000 7.0760 
    381.0000 190.0000 7.1090 
    383.0000 186.0000 7.1410 

>> coordinate_matrices{3} 

ans = 

    384.0000 184.0000 7.1630 
    384.0000 183.0000 7.1860 

>> coordinate_matrices{4} 

ans = 

    386.0000 179.0000 7.2190 
Verwandte Themen