MATLAB中的稀疏矩阵插值

7
如果我有一个像这样的矩阵:
A = [1 2; 3 4];

我可以使用interp2这样的函数进行插值,如下所示:

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,但是它们都不完全符合我的需求。

为什么TriScatteredInterp不能满足您的需求?它看起来很理想啊。 - Jacob
2
由于Triscatteredinterp在数组的角落处存在外推问题。基于镶嵌,它只会在数据的凸包内进行插值。 - user85109
1个回答

13

一个好的解决方案是使用我的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)

Inpainted surface from nearly empty array

编辑:

对于那些想知道inpaint_nans能否处理更复杂的表面的人,我曾经拿了一幅数字化的莫奈画作(在左侧看到),然后删除了随机50%的像素来破坏它。最后,我应用了inpaint_nans来看看是否可以恢复图像。右边的图像是修复后的图像。虽然分辨率低,但修复后的图像是一个相当不错的恢复。

Garden at Sainte-Adresse

作为另一个例子,请尝试这个:
[x,y] = meshgrid(0:.01:2);
z = sin(3*(x+y.^2)).*cos(2*x - 5*y);
surf(x,y,z)
view(-23,40)

base trig surface

现在,删除这个数组中大约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)

enter image description here


哇,真是一件不错的作品!你介意再展示一个更复杂的例子吗?谢谢。 - eat
另外,感谢您使用BSD许可证。如果这是GPL或类似的许可证,我想我就不能使用它了。 - devin
我可以在Octave中使用你的函数吗? - Wojtek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接