我得到了以下矩阵B
:
B =
1 4 7
2 5 8
3 6 9
我想填充这个矩阵,这样就有一个1元素的边界,用复制的边界元素围绕它。本质上,我想要这个结果:
B =
1 1 4 7 7
1 1 4 7 7
2 2 5 8 8
3 3 6 9 9
3 3 6 9 9
我如何在MATLAB中做到这一点?
如果您有图像处理工具箱,请使用padarray
,特别是replicate
标志。如果你没有,有人在Github上做了一个实现:https://github.com/gpeyre/matlab-toolboxes/blob/master/toolbox_nlmeans/toolbox/ordfilt2/padarray.m。您可以下载它并使用该功能供自己使用。
CCD_ 4创建较大的矩阵,其中源矩阵以该较大的矩阵为中心。关于如何使用额外的边界元素,您有几个选项。默认行为是将这些值设置为0。但是,我们可以指定replicate
标志,它沿着矩阵的原始边界复制值,并将它们放置在这个新矩阵的额外边界元素上。因为要从3 x 3到5 x 5,所以只需要沿两个维度都有一个1元素边界。您可以使用padarray
的第二个参数来指定它。replicate
标志是第三个参数:
>> B = reshape(1:9, 3, 3);
>> B2 = padarray(B, [1 1], 'replicate')
B2 =
1 1 4 7 7
1 1 4 7 7
2 2 5 8 8
3 3 6 9 9
3 3 6 9 9
编辑
如果不想使用padarray
,可以使用scatteredInterpolant
类,将nearest
作为插值标志。您将构建一个映射到B
中每个值的3 x 3 2D坐标空间网格,然后我们将指定一个5 x 5坐标空间网格(其中边界元素在原始3 x 3网格的范围之外)。类似这样的东西:
>> [X,Y] = meshgrid(1:3,1:3);
>> [X2,Y2] = meshgrid(0:4,0:4);
>> F = scatteredInterpolant(X(:),Y(:),B(:),'nearest');
>> B2 = F(X2, Y2)
B2 =
1 1 4 7 7
1 1 4 7 7
2 2 5 8 8
3 3 6 9 9
3 3 6 9 9
问题是明确地添加一个元素作为边界,所以试试这个(不需要工具箱):
B = [1 4 7; 2 5 8; 3 6 9] % or use B=rand(3,4), etc. to try something else.
B2 = B([1 1:end end],[1 1:end end])
这是结果(根据需要):
B =
1 4 7
2 5 8
3 6 9
B2 =
1 1 4 7 7
1 1 4 7 7
2 2 5 8 8
3 3 6 9 9
3 3 6 9 9