no time scores
1 10 123
2 11 22
3 12 22
4 50 55
5 60 22
6 70 66
. . .
. . .
n n n
高于我的txt文件的内容(数千行)。
1st column - number of samples
2nd column - time (from beginning to end ->accumulated)
3rd column - scores
我想创建一个新文件,该文件将是每三个得分样本的总和除以同一样本的时差。
e.g. (123+22+22)/ (12-10) = 167/2 = 83.5
(55+22+66)/(70-50) = 143/20 = 7.15
新的txt文件
83.5
7.15
.
.
.
n
到目前为止,我有这段代码:
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
....
答案 0 :(得分: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))
请注意,此处样本数NUM=3
是一个参数,可以替换为任何其他值。
另外,阅读上面的评论,如果样本数量不是这个数字的倍数(3
),那么只需事先这样做就丢弃剩余的样本:
data = data(1:fix(size(data,1)/NUM)*NUM,:);
对不起,这是一个更简单的问题:P
result = sum(reshape(data(:,3), NUM, []))' ./ (data(NUM:NUM:end,2)-data(1:NUM:end,2));
答案 1 :(得分:2)
%# Easier to load with importdata
data = importdata('data.txt',' ',1);
%# Get the number of rows
n = size(data,1);
%# Column IDs
time = 2;score = 3;
%# The interval size (3 in your example)
interval = 3;
%# Pre-allocate space
new_data = zeros(numel(interval:interval:n),1);
%# For each new element in the new data
index = 1;
%# This will ignore elements past the closest (floor) multiple of 3 as requested
for i = interval:interval:n
%# First and last elements in a batch
a = i-interval+1;
b = i;
%# Compute the new data
new_data(index) = sum( data(a:b,score) )/(data(b,time)-data(a,time));
%# Increment
index = index+1;
end
答案 2 :(得分:0)
对于它的价值,这里是你将如何在Python中做到这一点。它可能适用于Matlab。
import numpy
no, time, scores = numpy.loadtxt('data', skiprows=1).T
# here I assume that your n is a multiple of 3! otherwise you have to adjust
sums = scores[::3]+scores[1::3]+scores[2::3]
dt = time[2::3]-time[::3]
result = sums/dt
答案 3 :(得分:0)
我建议您使用importdata()
函数将数据导入名为data
的变量中。像这样:
data = importdata('data.txt',' ', 1)
用文件使用的分隔符替换' '
,1
指定Matlab应忽略1个标题行。然后,要计算结果,请尝试以下语句:
(data(1:3:end,3)+data(2:3:end,3)+data(3:3:end,3))./(data(3:3:end,2)-data(1:3:end,2))
这适用于您的示例数据,应该处理您拥有的实际数据。如果你自己弄明白,你将学习一些有用的Matlab。
然后使用save()
将结果写回文件。
PS如果你发现自己在Matlab中编写循环,你可能做错了。