Matlab读取文本,总和值直到条件,

时间:2013-05-02 04:25:42

标签: matlab

我有一个包含两列的.txt文件:第一个包含日期,第二个包含该日期的降水浮点值(ppt)。我想通读降水柱并总结每次风暴的降水量。风暴由零沉降时​​期分隔。因此,我基本上想告诉Matlab读取ppt列,将值加起来直到它读取0,将总和放入向量的单元格中,然后继续读取和重复。我知道我需要一个带有条件语句的循环。以下是我认为成功的代码可能基于我对Matlab的有限知识的相似性:

fid = fopen(12hr_ppt.txt');
C = textscan(fid);
l = length(fid);
? = 0;
for i=1:l;
    if fid(i)>0;
        ?=fid(i)+?;
    else
        ?=0;
    endif
    fprintf(?);
end

所以我基本上想要?是一个保持总降水量的矢量。拥有与事件相对应的日期也是非常好的,但是现在我只想解决这个问题。非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

您可以使用以下内容:

clear;
close;
clc;

date_ppt = importdata('testcase.txt');
num_rows = size(date_ppt.data,1);
end_storm = find(date_ppt.data == 0);
if(end_storm(1) == 1)
    end_storm = end_storm(2:end);
end
if(end_storm(end) ~= num_rows)
    end_storm = [end_storm;num_rows];
end
begin_storm = [1;(end_storm(1:(end-1)) + 1)];

accumulated_ppt = zeros(size(begin_storm));

for i = 1:numel(accumulated_ppt)
    accumulated_ppt(i) = sum(date_ppt.data(begin_storm(i):end_storm(i)));
end

accumulated_ppt

这里,我的“testcase.txt”包含以下内容:

Date    PPT
01/01/13    0.276
02/01/13    0.6797
03/01/13    0.6551
04/01/13    0.1626
05/01/13    0
06/01/13    0.4984
07/01/13    0.9597
08/01/13    0.3404
09/01/13    0.5853
10/01/13    0.2238
11/01/13    0.7513
12/01/13    0.2551
13/01/13    0.506
14/01/13    0.6991
15/01/13    0.8909
16/01/13    0.9593
17/01/13    0.5472
18/01/13    0
19/01/13    0.1493
20/01/13    0.2575
21/01/13    0.8407
22/01/13    0.2543
23/01/13    0.8143
24/01/13    0.2435
25/01/13    0.9293
26/01/13    0.35
27/01/13    0.1966
28/01/13    0.2511
29/01/13    0.616
30/01/13    0.4733
31/01/13    0.3517
01/02/13    0.8308
02/02/13    0.5853
03/02/13    0.5497
04/02/13    0.9172
05/02/13    0.2858
06/02/13    0.7572
07/02/13    0.7537
08/02/13    0.3804
09/02/13    0.5678
10/02/13    0.0759
11/02/13    0
12/02/13    0.5308
13/02/13    0.7792
14/02/13    0.934
15/02/13    0.1299
16/02/13    0.5688
17/02/13    0.4694
18/02/13    0.0119
19/02/13    0.3371

获得的输出是:

accumulated_ppt =

    1.7734
    7.2165
   11.4314
    3.7611

此外,“日期”列值存储在date_ppt.textdata(:,1)中。如果你只想要与end_storm对应的日期,你可以简单地使用`date_ppt.textdata(end_storm,1)':

>> date_ppt.textdata(end_storm,1)

ans = 

    '04/01/13'
    '17/01/13'
    '10/02/13'
    '18/02/13'