Среднее по столбцам по неравному количеству значений в матрице

Я ищу простой способ получить среднее значение по столбцам подмножества значений в матрице (индексированное логической матрицей), желательно без использования цикла. Проблема, с которой я сталкиваюсь, заключается в том, что, поскольку количество значений в каждом столбце различно, 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)

Почему без петель? Я уверен, что для размеров массивов, где важна реализация (т.е. очень большие массивы, для обработки которых требуется нетривиальное время), циклический подход будет самым быстрым. Циклы больше не медленные в MATLAB, и они не были, по крайней мере, 15 лет. Пришло время людям отказаться от этого менталитета «избегать петель любой ценой».

Cris Luengo 28.05.2019 23:13
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
110
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Другие вопросы по теме