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

时间:2016-03-31 11:37:18

标签: matlab matrix diagonal

我想从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中从矩阵中获取对角线?

3 个答案:

答案 0 :(得分:3)

如果我理解正确,您希望使用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

答案 1 :(得分:2)

尝试替换此部分:

         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

答案 2 :(得分:1)

我不知道为什么你想要一个while循环。如何使用MATLAB的内置diag函数直接索引每个对角线:

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