在 Fortran 中将上三角矩阵转换为向量

Convert upper triangular matrix into vector In Fortran

我想将矩阵的上三角部分转换为向量。

例如我有以下矩阵(为简单起见为 4x4):

 1     2     3     4  
 5     6     7     8 
 9     10    11    12
 13    14    15    16 
  1. 如何得到矩阵的上三角部分,写作'by rows':

    1 2 3 4 6 7 8 11 12 16

  2. 我怎样才能得到矩阵的上三角部分,写成'by columns':

    1 2 6 3 7 11 4 8 12 16

感谢您的帮助!

已编辑:这是生成单位矩阵的代码:

    program main

    use constants  ! global vairables and conventional constants
    use trans      ! transformation between different frames

    implicit none
    integer ::  ii, ij
    real*8,dimension(4,4) :: R_reg

    !call cpu_time(tic)


    write(*,*) "check1" !check-point

    !creating diagonal unity matrix
    DO ii = 1, 4  
        DO ij = 1, 4 
            R_reg(ij,ii) = (ij/ii)*(ii/ij) !integer division
        END DO
    END DO
    
    write(*,*) "check2" !check-point
    
    
    !create the test .txt file: 
    open(50, file='R_reg.txt', status='replace')
        DO ii=1, 4
            write(50,*) R_reg(ii,:)
        END DO  
    close(50)

    write(*,*) "check3" !check-point
 end program

它实际上只是以正确的顺序遍历数组并存储您遍历的元素。可能只需要进行一些试验才能使循环边界正确。

integer : n    
real*8,dimension(10) :: ut_c, ut_r    


DO ii = 1, 4  
    DO ij = 1, 4 
        R_reg(ij,ii) = ii + (ij-1)*4
    END DO
END DO

n = 0
DO ij = 1, 4 
    DO ii = ij, 4  
        n = n + 1
        ut_r(n) = R_reg(ij,ii)
    END DO
END DO


n = 0
DO ii = 1, 4
   DO ij = 1, ii
        n = n + 1
        ut_c(n) = R_reg(ij,ii)
    END DO
END DO

print *, "rows:", ut_r
print *, "columns:", ut_c

请注意,real*8 语法不是标准的 Fortran。参见 Fortran: integer*4 vs integer(4) vs integer(kind=4) and Fortran 90 kind parameter

如前所述,可以 row-by-row 或 column-by-column 选择所需的元素。使用数组构造函数不必担心跟踪至少一个索引:

  implicit none
  integer, parameter :: N=4
  
  integer A(N,N), i, j

  A = reshape([(i,i=1,N**2)], [N, N], order=[2,1])

  print '("Matrix:")'
  do i=1,N
     print '(*(I5))', A(i,:)
  end do

  print '(/,"By rows:",/,*(I5))', [((A(i,j), j=i,N), i=1,N)]
  print '(/,"By columns:",/,*(I5))', [((A(j,i), j=1,i), i=1,N)]

end program

要将 upper-triangular 部分存储在数组中,可以轻松地将数组构造函数分配给可分配的 rank-1 数组,而不是简单地打印出来。

尽可能简洁,“按行”:

[(R_reg(i, i:), i=1, 4)]

和“按列”:

[(R_reg(:i, i), i=1, 4)]