这篇文章跟进了另一篇文章: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。
相反,当最大值在第二列时,我想计算平均值,考虑最大值之前的一列,最大值和最大值之后的两列。
然而,当最大值位于倒数第二列时,我想考虑最大值之前的两列,最大值,以及最大值之后的一列。
如果你能帮助我,我将非常感激。非常感谢!
答案 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.