向量元素范围的平均值

时间:2016-11-09 09:33:38

标签: matlab

我在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列1-2,2-3,3-4 并找到2,3,4列的范围(0-1,1-2,2-3,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 个答案:

答案 0 :(得分: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等范围的平均值。

答案 1 :(得分: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等其他范围。