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看看我是否可以合理地恢复图像.右手图像是修复图像.虽然分辨率低,但恢复的图像恢复得体.

再举一个例子,试试这个:
[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)

| 归档时间: |
|
| 查看次数: |
5434 次 |
| 最近记录: |