fortran将csr格式(全存储)的稀疏矩阵改成只存储上三角元素

program main
        
        implicit none
        integer :: i, j, k, num, ii, jj
        !       1      2       3       4
        !-------------------------------
        !1|     10                    12
        !2|            21     33      1
        !3|            33     3            
        !4|     12     1              4
        !integer, parameter :: n = 4, nz = 10    !// n为行数, nz为非零元素个数
        !real*4  :: a(nz)   = [10.0, 12.0, 21.0, 33.0, 1.0, 33.0, 3.0, 12.0, 1.0, 4.0]
        !integer :: ia(n+1) = [1, 3, 6, 8, 11]
        !integer :: ja(nz)  = [1, 4, 2, 3, 4, 2, 3, 1, 2, 4]
        
        !// 将稀疏矩阵的数组存储上三角部分 
        !// [ 稀疏矩阵newa的大小: 7个元素 = (nz-n)/2+n ]
        !// [ 稀疏矩阵newia的大小: 5个元素 1, 3, 6, 7, 8 ]
        !       1      2       3       4
        !-------------------------------
        !1|     10                    12
        !2|            21     33      1
        !3|                   3            
        !4|                           4
        
        integer, parameter :: n = 5, nz = 13    !// n为行数, nz为非零元素个数
        real*4  :: a(nz)   = [1, 2, 4, 5, 7, 8, 9, 2, 5, 8, 11, 9, 12]
        integer :: ia(n+1) = [1, 3, 5, 8, 12, 14]
        integer :: ja(nz)  = [1, 4, 2, 4, 3, 4, 5, 1, 2, 3, 4, 3, 5]
        !       1      2       3       4        5
        !----------------------------------------
        !1|     1                      2
        !2|            4               5
        !3|                    7       8        9     
        !4|     2      5       8       11       
        !5|                    9                12
        
        !// 存储稀疏矩阵上三角部分的新数组
        real*4, allocatable  :: newa(:)
        integer              :: newnz
        integer, allocatable :: newia(:), newja(:)
        
        newnz = (nz-n)/2 + n
        allocate( newa(newnz), newja(newnz), newia(n+1) )
        
        j = 0; ii = 0; jj = 0
        newia(1) = 1
        do i = 1, n  !// 总共存储n行
                num = ia(i+1) - ia(i)   !// 原始每行的元素个数
                
                jj = 0
                do k = j+1, j+num
                        
                        if ( ja(k) >= i ) then
                                jj = jj + 1
                                ii = ii + 1
                                newja(ii) = ja(k)
                                newa(ii)  = a(k)
                        end if
                        
                end do
                newia(i+1) = newia(i) + jj
                j          = j  + num
        end do

        print*, newja
        print*, newia
        print*, newa
                        
end program main

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值