Найдите индексы в каждом столбце и интеллектуально усредните значения в том же столбце на основе индексов.

У меня есть матрица, в которой каждый столбец не зависит друг от друга. Тем не менее, каждый столбец имеет минимум 0 и максимум 1, это вероятность. Однако не обязательно, чтобы каждый столбец содержал только один 1. Это создаст мне проблему, когда я попытаюсь найти индексы каждого столбца, состоящего из 1. Индексы будут использоваться для извлечения значения другой матрицы, скажем, матрицы положения. Если он содержит два 1, значения должны быть усреднены. Пример кода:

prob=[rand(4,1) rand(4,1) rand(4,1)];
max_prob_idx=find(prob==1);
%extract from position matrix
pos=rand(4,3);
extracted_pos=pos(max_prob_idx); %this is wrong, look example below

Из приведенного выше кода я получу вектор-столбец extracted_pos. Это испортило мое извлечение данных. Численно:

prob=[1    0    1 
      0.1  1    0.8
      0.2  0.5  1
      0.3  1    1]

max_prob_idx=[1; 6; 8; 9; 11; 12];

pos=[1 5 9
     2 6 10
     3 7 11
     4 8 12]

extracted_pos=[1; 6; 8; 9; 11; 12]; %6x1 matrix

Мне не хватает чего-то промежуточного, так что мой окончательный ожидаемый extracted_pos будет

extracted_pos=[1; (6+8)/2; (9+11+12)/3]; %3x1 matrix

Я знаю, что это выглядит довольно грязно, но я не могу придумать другого способа объяснить мою проблему здесь. Можно ли это сделать? Или есть другой способ сделать это? Заранее спасибо!


person Gregor Isack    schedule 22.10.2017    source источник


Ответы (1)


% generate position matrix
pos = reshape(1:numel(prob),size(prob)); % technically the reshape is not necessary, a vector 1:numel(prob) would do it too, but I find it nicer.
% empty NaN matrix
P = nan(size(prob)); 
% extract 1 values
P(prob==1) = pos(prob==1);  % with real data you might have to make a check with tolerance
% mean of each column
extracted_pos = mean(P,1,'omitnan');

extracted_pos может, конечно, содержать числа с плавающей запятой - вам решать, как с ними обращаться

person Leander Moesinger    schedule 22.10.2017
comment
Ты гений! Большое спасибо! - person Gregor Isack; 22.10.2017
comment
nanmean из набора инструментов статистики и машинного обучения. Вместо этого используйте mean с 'omitnan' - person Sardar Usama; 22.10.2017