matlab - 以更有效的方式生成矩阵

标签 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] 范围内的值。

最佳答案

相反,尝试将二维卷积与 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/

相关文章:

c++ - 如何在 Matlab 2016b 中导入 Eigen C++ 库?

matlab - 执行mex文件时MATLAB崩溃

c - 在 C 中获取多维数组列的最有效方法

c - 矩阵求逆

c++ - 是否可以在不编辑源文件的情况下为库(Eigen)中的类创建新功能? (C++)

python - numpy 索引错误 : too many indices for array when indexing matrix with another

matlab - 使用 matlab 使用概率随机生成器

matlab - 如何在 MATLAB 中注释图表?

Matlab发布-想要使用自定义文件名发布多个pdf文件

c++ - 在 omp 循环中填充已知大小的矩阵。条目大小未知