Среднее по столбцу неравное число значений в матрице - PullRequest
1 голос
/ 28 мая 2019

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

    %% define value matrix and logical indexing matrix

    values=[1 2 3 4; 5 6 7 8; 9 10 11 12];
    indices=[1 0 0 1; 0 1 0 1; 1 1 0 0];
    indices=indices==1; %convert to logical

    %% calculate column-wise average

    mean(values(indices),1)

1 Ответ

4 голосов
/ 28 мая 2019

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);
...