循环MATLAB的问题

Jes*_*ssy 1 matlab loops

no  time  scores
1    10    123
2    11    22
3    12    22
4    50    55
5    60    22
6    70    66
.    .     .
.    .     .
n    n     n 
Run Code Online (Sandbox Code Playgroud)

在我的txt文件的内容之上(数千行).

1st column - number of samples
2nd column - time (from beginning to end ->accumulated)
3rd column - scores
Run Code Online (Sandbox Code Playgroud)

我想创建一个新文件,该文件将是每三个分数样本的总和除以同一样本的时差.

e.g. (123+22+22)/ (12-10) = 167/2 = 83.5
     (55+22+66)/(70-50) = 143/20 = 7.15
Run Code Online (Sandbox Code Playgroud)

新的txt文件

83.5
7.15
.
.
.
n
Run Code Online (Sandbox Code Playgroud)

到目前为止我有这个代码:

fid=fopen('data.txt')
data = textscan(fid,'%*d %d %d')
time = (data{1})
score= (data{2})
for sample=1:length(score)
     ..... // I'm stucked here ..
end
....
Run Code Online (Sandbox Code Playgroud)

Amr*_*mro 7

如果你喜欢冒险,这里是一个使用ACCUMARRAY的矢量化单行解决方案(假设你已经data像其他人一样在矩阵变量中读取了文件):

NUM = 3;
result = accumarray(reshape(repmat(1:size(data,1)/NUM,NUM,1),[],1),data(:,3)) ...
    ./ (data(NUM:NUM:end,2)-data(1:NUM:end,2))
Run Code Online (Sandbox Code Playgroud)

请注意,此处样本数NUM=3是一个参数,可以用任何其他值代替.

另外,阅读上面的评论,如果样本数不是这个数字的倍数(3),那么只需事先这样做就丢弃剩余的样本:

data = data(1:fix(size(data,1)/NUM)*NUM,:);
Run Code Online (Sandbox Code Playgroud)

对不起,这是一个更简单的一个:P

result  = sum(reshape(data(:,3), NUM, []))' ./ (data(NUM:NUM:end,2)-data(1:NUM:end,2));
Run Code Online (Sandbox Code Playgroud)