首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Fortran中将上三角矩阵转化为向量

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

Stack Overflow用户
提问于 2022-04-05 12:52:57
回答 3查看 203关注 0票数 3

我想把矩阵的上三角部分转换成向量。

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

代码语言:javascript
复制
 1     2     3     4  
 5     6     7     8 
 9     10    11    12
 13    14    15    16 

  1. 如何得到矩阵的上三角形部分,写成“按行”:

1 2 3 4 6 7 8 11 12

  1. 和如何获得矩阵的上三角形部分,写成“按列”:

1 2 6 3 7 11 4 8 12

谢谢你的帮忙!

编辑的:下面是生成标识矩阵的代码:

代码语言:javascript
复制
    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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-04-05 15:10:12

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

代码语言:javascript
复制
  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

要将上三角部件存储在数组中,可以轻松地将数组构造函数分配给可分配的秩-1数组,而不是简单地打印。

票数 3
EN

Stack Overflow用户

发布于 2022-04-05 14:04:03

它实际上只是按照正确的顺序遍历数组,并存储您所遍历的元素。可能只需要做一些实验就可以得到正确的循环边界。

代码语言:javascript
复制
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)Fortran 90 kind parameter

票数 4
EN

Stack Overflow用户

发布于 2022-04-05 18:51:45

尽可能简明扼要地“按行”:

代码语言:javascript
复制
[(R_reg(i, i:), i=1, 4)]

和“由科尔”:

代码语言:javascript
复制
[(R_reg(:i, i), i=1, 4)]
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71752135

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档