2016-11-09 3 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 колонке с 1-2, 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

Итак, в чем ваш вопрос? Вы ничего не просили. Также, пожалуйста, прочитайте [ask], так как мы хотели бы увидеть некоторые усилия с вашей стороны в решении этого вопроса, в частности, код, который вы уже пробовали. [edit] ваш вопрос, чтобы содержать [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 < 2, 2 <= 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

Смежные вопросы