2010-06-02 77 views
1
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文件(千行)的內容。問題與循環MATLAB

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

你能保證'n'是3的倍數嗎? – Jacob 2010-06-02 13:20:51

+0

沒有。如果剩餘的小於3,例如1或2個樣本,它會放棄它。 – Jessy 2010-06-02 13:32:51

回答

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 
+0

我想知道importdata和textscan有什麼不同? – Jessy 2010-06-02 15:34:34

+0

在'textscan'中,你需要指定格式,'importdata'在大部分時間裏都能計算出來。 – Jacob 2010-06-02 15:56:42

+0

我想知道文件中的「數據」。數據..引用文件的名稱? data.txt中? – Jessy 2010-06-02 16:03:36

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 
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中編寫循環,則可能是在做錯某些事情。

+0

@Mark:循環總是不錯的。這已經在SO中討論過了。此外,此解決方案將間隔固定爲3,('data(1:3:end,3)+ data(2:3:end)+ ...')。 – Jacob 2010-06-02 14:17:35

+0

它給了我這個錯誤 - mddivide內存不足 – Jessy 2010-06-02 18:12:03

+0

@Jessy - 你的數據集有多大? – 2010-06-02 18:16:32

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)); 
+0

+1:我以前從來沒有遇到過准將,我的解決方案比我的要好得多。謝謝@Amro。 – 2010-06-02 15:31:46

+0

+1:不過,它傷害了我的眼睛! – Jacob 2010-06-02 15:56:05