以更有效的方式生成矩阵

时间:2017-02-07 19:47:58

标签: matlab matrix

我正在寻找一种更有效的方法来制作以下矩阵L

      |2 -2  0 0 0     |
      |-1 2 -1 0 0  0  |
      |0 -1 2 -1 0     |
(1/2).|0 0 -1 2 -1     |
      |      . . .     |   
      |  0    0 -1 2 -1|
      |       0  0 -2 2|

到目前为止,我已经得到了这个:

L = diag(ones(n,1)*2)- ...
    diag(ones(n-1,1),1) - ... 
    diag(ones(n-1,1),-1);
L(1,2) = -2; 
L(end,end-1) = -2;
L = L/2;     

例如n=5产生:

L =

    1.0000   -1.0000         0         0         0
   -0.5000    1.0000   -0.5000         0         0
         0   -0.5000    1.0000   -0.5000         0
         0         0   -0.5000    1.0000   -0.5000
         0         0         0   -1.0000    1.0000

n可以是范围[5 1000]中的值。

2 个答案:

答案 0 :(得分:5)

相反,尝试使用带有conv2的2D卷积,其中输入是单位矩阵,水平[-0.5 1 -0.5]滤波器抽头是内核。这很好,因为您可以将此单位矩阵视为一个图像,并且您正在执行edge detection,其中您在输出中获得系数1的唯一时间是内核的中心直接位于1.如果内核中心不在1上,但任何元素都触及1,则结果为-0.5。这很不错,但它没有处理顶行和底行的边框情况。不幸的是,你必须手动修改。我们可以使用两个语句来转义以修改元素,而不是使用列主索引。这个解决方案肯定胜过使用3 diag次调用恕我直言。

n = 5;
L = conv2(eye(n), [-0.5 1 -0.5], 'same');
L([n+1 end-n]) = -1;

结果:

>> L

L =

    1.0000   -1.0000         0         0         0
   -0.5000    1.0000   -0.5000         0         0
         0   -0.5000    1.0000   -0.5000         0
         0         0   -0.5000    1.0000   -0.5000
         0         0         0   -1.0000    1.0000

答案 1 :(得分:3)

这是另一种方式:

n = 5;
L = full(spdiags(repmat([-1 2 -1],n,1), [-1 0 1], zeros(n)));
L([n+1 end-n]) = -2;