我正在寻找一种更有效的方法来制作以下矩阵 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]
范围内的值。
最佳答案
相反,尝试将二维卷积与 conv2
结合使用其中输入是单位矩阵,水平 [-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
关于matlab - 以更有效的方式生成矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42098673/