我正在寻找一种更有效的方法来制作以下矩阵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]
中的值。
答案 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;