MATLAB如何去除矩阵中的inf点并用周围点的平均值代替?
发布网友
发布时间:2022-04-23 18:50
我来回答
共1个回答
热心网友
时间:2023-08-19 16:32
你好,我没有找到符合你条件的方法,
但是我想出了一个办法可以解决你的问题。首先确定你要有统计工具箱,因为要用到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)
__________________________________