在 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
如何得到矩阵的上三角部分,写作'by rows':
1 2 3 4 6 7 8 11 12 16
我怎样才能得到矩阵的上三角部分,写成'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)]
我想将矩阵的上三角部分转换为向量。
例如我有以下矩阵(为简单起见为 4x4):
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
如何得到矩阵的上三角部分,写作'by rows':
1 2 3 4 6 7 8 11 12 16
我怎样才能得到矩阵的上三角部分,写成'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)]