扩展矩阵的边框并在MATLAB中复制边框元素

时间:2015-04-10 05:44:48

标签: matlab

我得到以下矩阵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中做到这一点?

2 个答案:

答案 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