2013-10-14 2 views
0

Мне нужна помощь в принятии следующих данных, которые организованы в большой матрице и усреднения всех значений, имеющих соответствующий идентификатор (индекс) и выводя другую матрицу только с идентификатором и усредненным значением, которое отслеживает его.Matlab сопоставляет первый столбец строки как индекс и затем усредняет все столбцы в этой строке

File with data format: 
(This is the StarData variable) 
ID>>>>Values 

002141865 3.867144e-03 742.000000 0.001121 16.155089 6.297494 0.001677 

002141865 5.429278e-03 1940.000000 0.000477 16.583748 11.945627 0.001622 

002141865 4.360715e-03 1897.000000 0.000667 16.863406 13.438383 0.001460 

002141865 3.972467e-03 2127.000000 0.000459 16.103060 21.966853 0.001196 

002141865 8.542932e-03 2094.000000 0.000421 17.452007 18.067214 0.002490 

Не вводить в заблуждение примеры, я отвечал, что первое число повторяется в течение приблизительно 15 линий, то изменения ID и который идет в течение целого набора различных идентификаторов, то они повторяются, как целая группа снова , подумайте первый блок кода = [1 2 3; 1 5 9; 2 5 7; 2 4 6], тогда код повторяется с разными значениями для столбцов, за исключением индекса. Основное различие - это значения, возвращающие идентификатор, который мне нужно усреднить в matlab, и выводят чистую матрицу, причем только один из каждого ID полностью усреднен для всех вхождений этого идентификатора. Спасибо за любую помощь.

+0

ID представляет первый столбец? И для сопоставления идентификаторов вы хотите усреднить данный столбец или все из них? –

+0

Это вам поможет? http://stackoverflow.com/questions/19056905/matlab-cell-array-average-two-values-if-another-column-matches –

+0

Я видел вопрос, который вы опубликовали, но я ищу среднее значение для всех столбцы и каждый раз, когда я пытаюсь использовать acummarray, я не могу заставить его усреднять все столбцы для меня, только один – ImmortalxR

ответ

1

Модификация this answer делает работу следующим образом:

[value_sort ind_sort] = sort(StarData(:,1)); 
[~, ii, jj] = unique(value_sort); 
n = diff([0; ii]); 
averages = NaN(length(n),size(StarData,2)); % preallocate 
averages(:,1) = StarData(ii,1); 
for col = 2:size(StarData,2) 
    averages(:,col) = accumarray(jj,StarData(ind_sort,col))./n; 
end 

В результате в переменной averages. Его первый столбец содержит значения, используемые в качестве индексов, и каждый последующий столбец содержит среднее значение для этого столбца в соответствии со значением индекса.

вопросы совместимости для Matlab 2013a, начиная:

Функция unique имеет в Matlab 2013a changed. По этой версии и далее, добавить 'legacy' флаг unique, т.е. заменить вторую линию по

[~, ii, jj] = unique(value_sort,'legacy') 
+0

Эй, это делает вывод в формате, который я хотел бы, однако, по какой-то причине он не дает мне средних значений? – ImmortalxR

+0

Можете ли вы опубликовать пример с легкими номерами и небольшой «StarData»? Например: задано 'StarData = [1 3 4; 1 5 6; 2 3 3] ', в результате чего вы получите точно? –

+0

Конечно, я отредактирую свой OP – ImmortalxR