MATLAB的稀疏矩阵插值

时间:2011-02-16 20:18:01

标签: matlab interpolation

如果我有这样的矩阵

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,但这些似乎都不符合我的需求。

1 个答案:

答案 0 :(得分:12)

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

使用inpainting进行恢复。 z轴具有不同的比例,因为在边缘上方和下方+/- 1处存在微小变化,但是否则,后者表面是良好的近似。

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

enter image description here