Более общий подход будет использовать unique
для поиска уникальных значений индекса:
[U, ix, iu] = unique(x(:, 1));
а затем accumarray
:
[c, r] = meshgrid(1:size(x, 2), iu);
y = accumarray([r(:), c(:)], x(:), [], @mean);
Объяснение
Входные значения для обработки на самом деле являются вторым параметром accumarray
.
первый параметр accumarray
— это матрица, каждая строка которой представляет собой набор индексов в (накопленной) выходной матрице, и он соответствует значению из соответствующей строки в векторе, заданном как второй параметр.
Думайте о выходе как о массиве ячеек. Вторые параметры являются входными значениями, и каждая строка в первом параметре сообщает, в какой ячейке выходной матрицы accumarray
должно храниться соответствующее входное значение. Когда вывод «массива ячеек» завершен, к каждой ячейке применяется функция (в нашем случае mean
).
Пример
Вот короткий пример с меньшей матрицей:
x = [27, 10, 8;
28, 20, 10;
28, 30, 50];
Мы находим уникальные значения:
[U, ix, iu] = unique(x(:, 1));
Вектор U
хранит уникальные значения, а iu
указывает, какой индекс значения связан с каждой строкой (обратите внимание, что в этом решении мы не используем ix
). В нашем случае получаем, что:
U =
27
28
iu =
1
2
2
Теперь применяем accumarray
:
[c, r] = meshgrid(1:size(x, 2), iu);
y = accumarray([r(:), c(:)], x(:), [], @mean);
Причудливый трюк с meshgrid
и [r(:), c(:)]
создает набор индексов:
[r(:), c(:)] =
1 1
2 1
2 1
1 2
2 2
2 2
1 3
2 3
2 3
и это индексы для входных значений x(:)
, которые являются эквивалентом вектора-столбца x
:
x(:) =
27
28
28
10
20
30
8
10
50
Процесс накопления:
- Первое значение 27 помещается в ячейку ‹1,1> в выходной матрице.
- Второе значение 28 помещается в ячейку ‹2,1> в выходной матрице.
- Третье значение 28 помещается в ячейку ‹2,1> в выходной матрице.
Видишь, что только что произошло? Оба значения 28 накапливаются в одной и той же ячейке (и в конечном итоге они будут усреднены). Процесс продолжается:
- Четвертое значение 10 помещается в ячейку ‹1,2> в выходной матрице.
и так далее...
Как только все значения сохранены в ячейках, функция mean
применяется к каждой ячейке, и мы получаем окончательную выходную матрицу:
y =
27 10 8
28 25 30
person
Eitan T
schedule
18.04.2013