我正在寻找一种更有效的方法来制作以下矩阵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|
Run Code Online (Sandbox Code Playgroud)
到目前为止,我有这个:
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;
Run Code Online (Sandbox Code Playgroud)
例如,因为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
Run Code Online (Sandbox Code Playgroud)
n
可以是范围内的值[5 1000]
.
相反,尝试使用2D卷积,conv2
其中输入是单位矩阵,水平[-0.5 1 -0.5]
滤波器抽头是内核.这很好,因为您可以将此单位矩阵视为一个图像,并且您正在执行边缘检测,其中您在输出中获得系数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;
Run Code Online (Sandbox Code Playgroud)
结果:
>> 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
Run Code Online (Sandbox Code Playgroud)