2016-11-09 71 views
0

我在MATLAB中有大量的數據(350695x5)。 一個例子是這樣的:向量元素範圍的平均值

z = [ 
1.79 0.16 0.16 21.39 21.50 
1.83 0.16 0.16 21.39 22.40 
1.92 0.16 0.16 21.39 22.00 
2.07 0.16 0.16 21.39 22.00 
2.36 0.15 0.15 21.39 21.08 
2.96 0.13 0.13 21.39 21.04 
3.21 0.13 0.13 21.39 23.00 
3.72 0.12 0.12 21.39 24.00 
3.87 0.11 0.11 21.39 21.39 
4.14 0.10 0.10 21.39 22.00 
4.14 0.10 0.10 21.39 21.50 
4.16 0.10 0.10 21.39 21.39] 

,我需要它以下列方式排序: 基於1-2列1中,2-3,3-4 並找到平均值範圍(0-1,1-2,2-3,3-4)爲2,3,4列

的結果應該是這樣的:

1 0.16 0.16 21.39 21.97 
2 0.15 0.15 21.39 21.49 
3 0.12 0.12 21.39 22.68 
4 0.10 0.10 21.39 21.63 

的問題是,我不能對它進行排序以適當的方式。

溶液的一部分可通過

[ii jj] = ndgrid(z(:,1)+1,1:size(z,2)-1) %should sort first column from 0-1,1-2, 2-3, 3-4 
z23 = z(:,2:end) 
out = [unique(z(:,1)),accumarray([ii(:),jj(:)],z23(:),[],@mean)], %find mean value 
+2

那麼你的問題是什麼?你沒有問過任何問題。另外,請閱讀[問],因爲我們希望看到你的一些努力來解決這個問題,特別是你已經嘗試過的代碼。您的問題包含[mcve]。 – Adriaan

回答

4

試試這個:

idx = floor(z(:, 1)); 
sub = [idx z(:, 2:5)]; 
[xx, yy] = ndgrid(idx, 1:size(sub, 2)); 
out = accumarray([xx(:) yy(:)], sub(:), [], @mean) 

out = 

    1.0000 0.1600 0.1600 21.3900 21.9667 
    2.0000 0.1467 0.1467 21.3900 21.3733 
    3.0000 0.1200 0.1200 21.3900 22.7967 
    4.0000 0.1000 0.1000 21.3900 21.6300 

結果不完全與你匹配。我不確定我是否完全理解您想要的內容,但我編寫的代碼計算範圍爲1 <= x < 22 <= x < 3等的平均值。

0

使用邏輯索引來描述找到z的值,其中在一定的範圍適用,例如:

i01 = (z >= 0) & (z < 1); % Find logical indices 
z01 = z(i01); % Get values from 0 up to 1 (but not including 1) 

然後,在平均值的計算很容易:mu_z01 = mean(z01);。當然,同樣的方法可以應用於從1到2,2到3等的其他範圍。

+2

所以你會手動複製每個可以想象的範圍的代碼?看起來像很多工作。 – Adriaan

+3

@Adriaan,當然不是。答案不應該總是完全回答這個問題,而是引導提問者走向他們的目標。每個可以想象的範圍都可以使用for循環進行編程。這個答案絕不是問題的完整答案,但答案的一部分。 – Erik