首页 文章

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

提问于
浏览
-3

我想从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 回答

  • 1

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

    我没有't know why you want a while loop. What about directly indexing each of your diagonals using MATLAB'的内置diag功能:

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

相关问题