循环MATLAB的问题

时间:2010-06-02 13:04:17

标签: 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 

高于我的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
....

4 个答案:

答案 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中编写循环,你可能做错了。