1

我有一个包含以空格分隔的数字数据的两列的文本文件。数据分为多个段,其中每个段包含可变数量的行,并且下一个段的开头由单行表示NaN(因此下面的数据将由四个段组成):


5.1[空格] 0.0
9.2[空格] 1.4
3.7[空格] 0.6
...[空格] ...
...[空格] ...
...[空格] ...
NaN[空格] [空格] [空格] [空格] [空格] [空格] [空格] [空格] [空格] [空格] [空格] ] [空间] [空间]等等...NaN
9.76.3
1.41.0
......
......
NaNNaN
8.70.0
5.17.4
3.72.6
......
NaNNaN
1.78.4
......


现在我想生成一个图,显示文件中每个数据段的曲线(通过将每个段1st列与其2nd列绘制)。
如果我知道该怎么做

  • 每个段中的行数相同,并且

  • 段数是已知的。

当段大小可变且段数未知时,如何有效地做到这一点?

4

1 回答 1

2

我生成了一些与您的文件类似的随机数据。像您描述的那样的文本文件可以像这样加载(load正确处理 NaN):

Data = load(filename, '-ascii');

我知道这段代码并不完美,但它适用于由 NaN 分隔的任意数量的段。

% Here I generate some random points to test the code
NPoints                     = 100;

Data                        = rand(NPoints,2);
% Insert NaNs in both columns
Data( Data(:,1)>0.9, : )    = NaN;

% Now do some magic
idxNaN                          = find( isnan( Data(:,1) ) );
idxNearNaNs                     = [ idxNaN-1 idxNaN+1 ]';
SegmentStartEnd                 = reshape( [1;idxNearNaNs(:);NPoints] , 2, [] )';
SegmentsOK                      = ( SegmentStartEnd(:,2) - SegmentStartEnd(:,1) ) >= 0;
SegmentStartEnd( ~SegmentsOK,:) = [];

% SegmentStartEnd contain start and end rows of good segments
NumberOfSegments = size(SegmentStartEnd,1);
fprintf('NaNs positions: %s\n', sprintf('%g ',idxNaN));
fprintf('%d segments found\n', NumberOfSegments);

% Now plot the data
figure;
hold all;
for k=1:NumberOfSegments
    SegmentStart    = SegmentStartEnd(k,1);
    SegmentEnd      = SegmentStartEnd(k,2);
    fprintf('Segment #%04d: Rows %04d to %04d\n', k, SegmentStart,SegmentEnd);
    plot( Data(SegmentStart:SegmentEnd,1) , Data(SegmentStart:SegmentEnd,2) );
end

如果您需要一些解释,请告诉我。

于 2013-05-14T17:18:34.197 回答