查找每列中的索引,并根据索引智能地平均同一列中的值

时间:2017-10-22 07:44:15

标签: matlab matrix indexing

我有一个矩阵,每列都是相互独立的。也就是说,每列的最小值为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

我知道这看起来很乱,但我想不出任何其他方式来解释我的问题。可以这样做吗?或者还有其他方法可以做到这一点?提前谢谢!

1 个答案:

答案 0 :(得分:3)

% 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当然可以包含浮点数 - 这取决于你如何处理它们