Sparse Matrix Interpolation With MATLAB

独自空忆成欢 提交于 2019-12-09 11:31:01

问题


If I have a matrix like this

A = [1 2; 3 4];

I can use interp2 to interpolate it like this

newA = interp2(A,2);

and I get a 5x5 interpolated matrix.

But what if I have a matrix like this:

B = zeros(20);
B(3,2) = 5;
B(17,4) = 3;
B(16, 19) = 2.3;
B(5, 18) = 4.5;

How would I interpolate (or fill-in the blanks) this matrix. I've looked into interp2 as well as TriScatteredInterp but neither of these seem to fit my needs exactly.


回答1:


A good solution is to use my inpaint_nans. Simply supply NaN elements where no information exists, then use inpaint_nans. It will interpolate for the NaN elements, filling them in to be smoothly consistent with the data points.

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)

Edit:

For those interested in whether inpaint_nans can handle more complex surfaces, I once took a digitized Monet painting (seen on the left hand side, then corrupted it by deleting a random 50% of the pixels. Finally, I applied inpaint_nans to see if I could recover the image reasonably well. The right hand image is the inpainted one. While the resolution is low, the recovered image is a decent recovery.

As another example, try this:

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

Now, delete about 7/8 of the elements of this array, replacing them with NaNs.

k = randperm(numel(z));
zcorrupted = z;
zcorrupted(k(1:35000)) = NaN;

Recover using inpainting. The z-axis has a different scaling because there are minor variations above and below +/-1 around the edges, but otherwise, the latter surface is a good approximation.

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



来源:https://stackoverflow.com/questions/5021646/sparse-matrix-interpolation-with-matlab

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!