在 Matlab 中获取矩阵的对角线?

To Get Diagonals of a Matrix in Matlab?

我想从 Matlab 中的矩阵中获取对角线。 例如,给定以下矩阵

M = [1  1   4   5   4
     2  5   1   2   2
     4  1   2   1   3
     1  3   1   1   1
     1  2   3   3   1]

我想得到构成上对角线的向量列表: {[1 1 1 1], [4 2 3], [5 2] [4]}

一次尝试

我想用 Matlab 中的 while 循环替换 if 子句

     if (i==j)
        A(t+1,i) = M(i,j)
     end
     if (i==j+1) 
        A(t+1,i) = M(i,j)
     end
     ...
     if (i==j+N) 
        A(t+1,i) = M(i,j)
     end

存储矩阵的所有对角线

t = 0;
while (t < 5)   % if-clauses replaced here by this
   for i=1:5
      for j=i:5
          if (i == j+t)
             trend(t+1,i) = M(i,j); 
          end
      end
   end
t = t + 1;
end

想法是将元素存储到矩阵 trend 中,条件 i == j+t 我发现该条件适用于上三角形的对角线。 if 子句被错误的伪代码取代,它试图通过矩阵的上三角,但是错误的是因为在 trend

中没有找到“1”向量

如何从 Matlab 中的矩阵中获取对角线?

尝试替换这部分:

         if (i==j)
            A(t+1,i) = M(i,j)
         end
         if (i==j+1) 
            A(t+1,i) = M(i,j)
         end
         ...
         if (i==j+N) 
            A(t+1,i) = M(i,j)
         end

与:

             if (i>=j && i<=j+N) 
                A(t+1,i) = M(i,j)
             end

我不知道你为什么要 while 循环。使用 MATLAB 的内置 diag 函数直接索引每条对角线怎么样:

n = size(M,1)
for t = 1:n-1
    trend{t} = M(diag(true(n-t,1),t));    
end

如果我没理解错的话,您想使用 spdiags 函数来提取上部非对角线。示例:

N = 5;
M = magic(N)
D = spdiags(M, 1:N-1)
DD = arrayfun(@(i) D(i+1:end,i).', 1:N-1, 'Uniform',false)
celldisp(DD)

结果:

M =
    17    24     1     8    15
    23     5     7    14    16
     4     6    13    20    22
    10    12    19    21     3
    11    18    25     2     9

D =
     0     0     0     0
    24     0     0     0
     7     1     0     0
    20    14     8     0
     3    22    16    15

DD = 
    [1x4 double]    [1x3 double]    [1x2 double]    [15]
DD{1} =
    24     7    20     3
DD{2} =
     1    14    22
DD{3} =
     8    16
DD{4} =
    15