基于矩阵的最大值的平均值

时间:2016-06-21 13:57:52

标签: matlab matrix max mean

这篇文章跟进了另一篇文章:find common value of one matrix in another matrix

正如我在那里解释的那样,我有一个矩阵MyMatrix 2549x13double

MyMatrix的几个示例行:

-7.80   -4.41   -0.08   2.51    6.31    6.95    4.97    2.91    0.66    -0.92   0.31    1.24    -0.07
 4.58    5.87    6.18    6.23    5.20    4.86    5.02    5.33    3.69    1.36    -0.54   0.28    -1.20
-6.22   -3.77   1.18    2.85    -3.55   0.52    3.24    -7.77   -8.43   -9.81   -6.05   -5.88   -7.77
-2.21   -3.21   -4.44   -3.58   -0.89   3.40    6.56    7.20    4.30    -0.77   -5.09   -3.18   0.43

我已经确定了矩阵MyMatrix的每一行的最大值如下:

[M Ind] = max(MyMatrix,[],2); 我在M中获得的示例行:

6.95
6.23
3.24
7.20

现在,我想在MyMatrix中选择M中找到的最大值之前和之后的2个值,因为我需要计算这5个值的平均值。所以,在这个例子中,我想选择:

2.51    6.31    6.95    4.97    2.91
5.87    6.18    6.23    5.20    4.86
-3.55   0.52    3.24    -7.77   -8.43
3.40    6.56    7.20    4.30    -0.77

并在MyMatrix中创建一个具有这5个值的平均值的新列。

遵循@Dan的代码,取自上一篇文章:

colInd = bsxfun(@plus,PeakInd, -2:2);
MyMatrixT = MyMatrix.';
rowIndT = colInd.';
linIndT = bsxfun(@plus,rowIndT,0:size(MyMatrixT,1):size(MyMatrixT,1)*(size(MyMatrixT,2)-1));
resultT = MyMatrixT(linIndT);
result = resultT.';
mean(result,2)
MyMatrix = [MyMatrix, mean(result,2)];

这是帖子的新部分,关于最大值接近边缘时的问题。 当最大值是MyMatrix的第一列或最后一列时,我想拥有NaN。

相反,当最大值在第二列时,我想计算平均值,考虑最大值之前的一列,最大值和最大值之后的两列。

然而,当最大值位于倒数第二列时,我想考虑最大值之前的两列,最大值,以及最大值之后的一列。

如果你能帮助我,我将非常感激。非常感谢!

2 个答案:

答案 0 :(得分:1)

您可以使用nanmean / min来获取正确的索引,而不是使用NaNs加max创建2D数组:

pad = 2;
[~, Ind] = max(MyMatrix, [], 2);
minCol = max(1, Ind-pad);
maxCol = min(size(MyMatrix, 2), Ind+pad);
result = arrayfun(@(row, min_, max_) mean(MyMatrix(row, min_:max_)),...
                  (1:size(MyMatrix, 1)).', minCol, maxCol);

答案 1 :(得分:0)

如果您有图像处理工具箱,还可以使用padarray,例如

B = padarray(magic(5),[0 2],NaN);

B =

   NaN   NaN    17    24     1     8    15   NaN   NaN
   NaN   NaN    23     5     7    14    16   NaN   NaN
   NaN   NaN     4     6    13    20    22   NaN   NaN
   NaN   NaN    10    12    19    21     3   NaN   NaN
   NaN   NaN    11    18    25     2     9   NaN   NaN

(...如果你没有padarray,只需在两边手动添加2个NaN列)然后使用一些bsxfun + sub2ind我们得到所需的结果:

pad_sz = 2;
B = padarray(magic(5),[0 pad_sz],NaN);
[~,I] = nanmax(B,[],2); % by using nanmax we "explicitly" say we ignore NaNs.
colInd = bsxfun(@plus,-pad_sz:pad_sz,I);
linearInd = sub2ind(size(B), repmat((1:5).',[1,size(colInd,2)]), colInd);
picks = B(linearInd);
res = nanmean(picks,2);
% or combine the last 3 lines into:
% res = nanmean(B(sub2ind(size(B), repmat((1:5).',[1,size(colInd,2)]), colInd)),2);
res = res + 0./~(I == pad_sz+1 | I == size(B,2)-pad_sz); %add NaN where needed.