改变矩阵中心对角线旁边的对角线

Changing the diagonals beside center diagonal of matrix

有没有快速改变中心对角线旁边的对角线的方法(参考下面的1):

m =  
 2     1     0     0     0     0     0     0     0
 1     2     1     0     0     0     0     0     0
 0     1     2     1     0     0     0     0     0
 0     0     1     2     1     0     0     0     0
 0     0     0     1     2     1     0     0     0
 0     0     0     0     1     2     1     0     0
 0     0     0     0     0     1     2     1     0
 0     0     0     0     0     0     1     2     1
 0     0     0     0     0     0     0     1     2

更改中心对角线的快速方法是 m(logical(eye(size(m)))) = 2。如何将其旁边的对角线分配给 1 的值?

diag 函数采用第二个参数,k,指定目标对角线:

diag([-1,-1,-1,-1],-1) % or diag(-1*ones(4,1),1)

ans = 

     0    0    0    0    0
    -1    0    0    0    0
     0   -1    0    0    0
     0    0   -1    0    0
     0    0    0   -1    0


diag([1,1,1,1],1)

ans = 

     0    1    0    0    0
     0    0    1    0    0
     0    0    0    1    0
     0    0    0    0    1
     0    0    0    0    0

diag([2,2,2],2)

ans = 

     0    0    2    0    0
     0    0    0    2    0
     0    0    0    0    2
     0    0    0    0    0
     0    0    0    0    0

如果您已经有一个现有矩阵并且想要更改其中一条对角线,您可以这样做:

M = magic(5) % example matrix
v = [1,2,3,4] % example vector that must replace the first diagonal of M, i.e. the diagonal one element above the main diagonal

M - diag(diag(M,1),1) + diag(v,1)

想法是首先使用diag 提取要更改的对角线的数字,diag(M,1)。然后再次使用 diag 将第一次调用 diag 创建的向量更改为矩阵 diag(diag(M,1),1)。您会注意到,这将创建一个矩阵,其维度与 M 相同,数字与第一个对角线上的 [​​=20=] 相同,其他地方的数字与 0 相同。因此 M - diag(diag(M,1),1) 只是将第一个对角线设置为 0。现在 diag(v,1) 创建一个与 M 维度相同的矩阵,即到处都是 0 但在第一个对角线上具有 v 的数字,因此仅添加 diag(v,1)由于 -diag(diag(M,1),1)

,影响了第一个对角线,它全 0s

如果您只是将常量应用于对角线(例如将主对角线下方第一个对角线上的所有值设置为 6)的替代方案:

n = 5;
k = -1;
a = 6;
M = magic(n);
ind = diag(true(n-abs(k),1),k);
M(ind) = a;