accumarray
подход на основе
Использовать индекс столбца в качестве переменной группировки для accumarray
:
[~, col] = find(indices);
result = accumarray(col(:), values(indices), [size(values,2) 1], @mean, NaN).';
Обратите внимание, что:
Во второй строке используется (:)
, чтобы первый вход был вектором столбца. Это необходимо, потому что первая строка может выдавать col
как вектор строки или столбца, в зависимости от размера indices
.
NaN
используется в качестве значения заполнения. Это указывается как пятый вход для accumarray
.
Третий вход в accumarray
определяет размер вывода. Необходимо указать это явно (в отличие от того, чтобы accumarray
выяснил это) в случае, если последние столбцы indices
содержат только false
.
хакерский подход
Умножьте и разделите поэлементно на indices
. Это превратит нежелательные записи в NaN
, который затем может быть проигнорирован mean
с использованием опции 'omitnan'
:
result = mean(values.*indices./indices, 1, 'omitnan');
Ручной подход
Умножить поэлементно на indices
, суммировать каждый столбец и делить поэлементно на сумму каждого столбца indices
:
result = sum(values.*indices, 1) ./ sum(indices, 1);