MATLAB的稀疏矩阵插值

dev*_*vin 7 matlab interpolation

如果我有这样的矩阵

A = [1 2; 3 4];
Run Code Online (Sandbox Code Playgroud)

我可以使用interp2来插入它

newA = interp2(A,2);
Run Code Online (Sandbox Code Playgroud)

我得到一个5x5插值矩阵.

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

B = zeros(20);
B(3,2) = 5;
B(17,4) = 3;
B(16, 19) = 2.3;
B(5, 18) = 4.5;
Run Code Online (Sandbox Code Playgroud)

我将如何插入(或填充空白)此矩阵.我已经研究过interp2以及TriScatteredInterp,但这些似乎都不符合我的需求.

小智 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)
Run Code Online (Sandbox Code Playgroud)

几乎空阵列的修复表面

编辑:

对于那些对inpaint_nans是否可以处理更复杂的表面感兴趣的人,我曾经拍过数字化的莫奈画(在左手边看,然后通过删除50%的像素随机来破坏它.最后,我应用inpaint_nans看看我是否可以合理地恢复图像.右手图像是修复图像.虽然分辨率低,但恢复的图像恢复得体.

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)
Run Code Online (Sandbox Code Playgroud)

基部三角形表面

现在,删除大约7/8的这个数组元素,用NaN替换它们.

k = randperm(numel(z));
zcorrupted = z;
zcorrupted(k(1:35000)) = NaN;
Run Code Online (Sandbox Code Playgroud)

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

zhat = inpaint_nans(zcorrupted);
surf(x,y,zhat)
view(-23,40)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述