查看单个帖子
旧 2019-12-14, 20:13   #1
poster
高级会员
 
注册日期: 2019-11-21
帖子: 3,006
声望力: 66
poster 正向着好的方向发展
帖子 用MATLAB进行稀疏矩阵插值

如果我有这样的矩阵

A = [1 2; 3 4]; 我可以像这样使用interp2进行插值

newA = interp2(A,2); 然后得到一个5x5的插值矩阵

但是,如果我有一个像这样的矩阵怎么办:

B = zeros(20); B(3,2) = 5; B(17,4) = 3; B(16, 19) = 2.3; B(5, 18) = 4.5; 我将如何对这个矩阵进行插值(或填补空白)。我已经研究过interp2以及TriScatteredInterp,但是这些似乎都不完全适合我的需求。



回答:

一个好的解决方案是使用我的inpaint_nans 。只需提供不存在任何信息的NaN元素,然后使用inpaint_nans。它将对NaN元素进行插值,将其填充以与数据点平滑一致。

B = nan(20); B(3,2) = 5; B(17,4) = 3; B(16, 19) = 2.3; B(5, 18) = 4.5; Bhat = inpaint_nans(B); surf(B,'marker','o') hold on surf(Bhat)

编辑:

对于那些对inpaint_nans是否可以处理更复杂的表面感兴趣的人,我曾经拍摄过一张数字化的莫奈画(在左侧看到,然后通过随机删除50%的像素来破坏它。最后,我应用了inpaint_nans来查看是否可以可以很好地恢复图像,右边的图像是已修复的图像,而分辨率较低时,恢复的图像是不错的恢复。



作为另一个示例,请尝试以下操作:

[x,y] = meshgrid(0:.01:2); z = sin(3*(x+y.^2)).*cos(2*x - 5*y); surf(x,y,z) view(-23,40)

现在,删除此数组中大约7/8的元素,将其替换为NaN。

k = randperm(numel(z)); zcorrupted = z; zcorrupted(k(1:35000)) = NaN; 使用修复进行恢复。 z轴具有不同的缩放比例,因为在边缘周围的+/- 1上下都有微小的变化,但否则,后一个表面是一个很好的近似值。

zhat = inpaint_nans(zcorrupted); surf(x,y,zhat) view(-23,40)



更多&回答...
poster 当前离线   回复时引用此帖