我得到以下矩阵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中做到这一点?
答案 0 :(得分:4)
如果您有图像处理工具箱,请使用padarray
,特别是replicate
标记。如果你没有它,那么有人在Github上做了一个实现:https://github.com/gpeyre/matlab-toolboxes/blob/master/toolbox_nlmeans/toolbox/ordfilt2/padarray.m。您可以下载它并使用该功能供您自己使用。
padarray
创建一个更大的矩阵,源矩阵位于这个更大的矩阵中心。关于使用额外边框元素可以做什么,您有几种选择。默认行为是将它们设置为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
作为插值标记。您将构建一个3 x 3 2D空间坐标网格,映射到B
中的每个值,然后我们指定一个5 x 5空间坐标网格,其中边框元素在原始范围之外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
答案 1 :(得分:1)
问题是明确地添加单个元素作为边框,因此请尝试以下操作(无需工具箱):
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