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

时间:2016-06-02 08:41:48

标签: matlab matrix diagonal

是否可以快速更改中心对角线旁边的对角线(参考下面的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

的值

1 个答案:

答案 0 :(得分:2)

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具有相同尺寸的矩阵,与第一个对角线上的M和其他地方的0相同的数字。因此M - diag(diag(M,1),1)只将第一个对角线设置为0。现在diag(v,1)创建了一个与M具有相同维度的矩阵,其中0到处都是v,但在第一个对角线上的数字为diag(v,1),因此仅添加0由于-diag(diag(M,1),1)

,影响第一个对角线,即所有6 s

如果您只是将一个常数应用于对角线(例如将主对角线下方的第一个对角线上的所有值设置为n = 5; k = -1; a = 6; M = magic(n); ind = diag(true(n-abs(k),1),k); M(ind) = a; ),则可以选择其他方法:

        var tfs = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(new Uri(Configuration.ServiceUri));
        tfs.EnsureAuthenticated(); 
        var versionControl = tfs.GetService<VersionControlServer>();

        var mybranches = versionControl.QueryRootBranchObjects(RecursionType.Full);
        foreach (var br in mybranches) //nothing here
        {
            Console.WriteLine(br);
        }