MATLAB如何去除矩阵中的inf点并用周围点的平均值代替?

[Inf 3 2 1 4 6
9 8 7 4 6 6
Inf 5 3 Inf 7 9
6 9 4 8 0 Inf
5 8 Inf 9 5 1
0 8 Inf 9 3 7]
在这个6×6的矩阵中,我想去除Inf的点,并用这个点周围的点的平均值代替。如果这个点在矩阵中间,就用它周围不是Inf的8个点(相当於3×3的mask在去除Inf的点)的平均值来代替,比如点(3,4)。可Inf的点还可能在边界上,比如点(3,1),我可以用它周围的5各点的平均值代替。可是还有的Inf点在角上,比如(1,1)。还有的Inf周围点也是Inf,比如(5,3)和(6,3),在数mask的时候就要把这样的周围点去掉。这样一来,我分情况讨论就太多了,要写好多个if,很麻烦。请教高手,MATLAB中有没有现成的函数可以做这个功能?谢谢啦!

你好,我没有找到符合你条件的方法,
但是我想出了一个办法可以解决你的问题。首先确定你要有统计工具箱,因为要用到nanmean()这个函数

做法是首先把你这个矩阵的inf去掉,改成NaN 假设你的矩阵在x
x(find(isinf(x)))=NaN
然后设定一个维数比x大的矩阵
a= ones(size(x)+2)
a(find(a==1))=NaN
a(2:end-1,2:end-1)=x

这样你就会有一个矩阵:
NaN NaN NaN NaN NaN NaN NaN NaN
NaN 35 1 6 26 19 24 NaN
NaN 3 32 7 NaN 23 25 NaN
NaN 31 9 2 22 27 20 NaN
NaN 8 NaN 33 17 10 15 NaN
NaN 30 5 34 12 14 16 NaN
NaN 4 36 29 13 18 11 NaN
NaN NaN NaN NaN NaN NaN NaN NaN
类似于这样的

这时候你就可以找NaN了,搜索范围在a(2:end-1,2:end-1)

[r,c]=find(isnan(a(2:end-1,2:end-1)))
不知道为什么这个r和c比实际的行和列小1,所以我们可以直接用

你要做的就是
for i = 1:length(r)
a(r(i)+1,c(i)+1) = nanmean(reshape(a(r(i):r(i)+2,c(i):c(i)+2),1,[]))
end

你把我如上代码存为一个.m就可以很方便的运用了。
___________________________________
function [replaced] = replaceInf(x)
x(find(isinf(x)))=NaN
a= ones(size(x)+2)
a(find(a==1))=NaN
a(2:end-1,2:end-1)=x

[r,c]=find(isnan(a(2:end-1,2:end-1)))
for i = 1:length(r)
a(r(i)+1,c(i)+1) = nanmean(reshape(a(r(i):r(i)+2,c(i):c(i)+2),1,[]))
end

replaced = a(2:end-1,2:end-1)
__________________________________
本人原创,希望对你有所帮助。
我没每一步没有做标注,但是很简单的
nanmean是求平均值,忽略NaN。
reshape是把那个取出来的矩阵变成一个数组,不然nanmean会计算每一列的平均值。
当然这个也有小问题,就是nan周围有nan的时候,函数会先计算出第一个NaN的值,赋值,然后去计算下一个的时候就包含了第一个NaN的值了。 这个顺序是根据find找到NaN的顺序来的。 这个你可以自行测试。
例如:

NaN NaN NaN NaN
NaN 2 NaN NaN
NaN NaN 3 NaN
NaN NaN NaN NaN
首先找到 2,3处的NaN
计算平均值 2.5
然后到3,2处的NaN
计算的时候因为2,3处的NaN已经是2.5了
就会把这个NaN加入计算范围中
等于算了(2 + 3 + 2.5)/3
然后赋值2.5给3,2处的NaN

解决方法是,首先单独备份所有NaN周围的数
然后计算的时候用这个备份。
请根据你的需求选择方法,貌似后面的是你要的。 如果有错误还请包含,思路就是如此了。

___________________________________
function [replaced] = replaceInf(x)
x(find(isinf(x)))=NaN
a= ones(size(x)+2)
a(find(a==1))=NaN
a(2:end-1,2:end-1)=x

[r,c]=find(isnan(a(2:end-1,2:end-1)))
for i = 1:length(r)
bak (i)=nanmean(reshape(a(r(i):r(i)+2,c(i):c(i)+2),1,[]))
end
for i = 1:length(r)
a(r(i)+1,c(i)+1) =bak(i)
end

replaced = a(2:end-1,2:end-1)
__________________________________
温馨提示:答案为网友推荐,仅供参考
相似回答