我试图使用fortran将压缩的稀疏列格式转换为压缩的稀疏行格式。这是我到目前为止所拥有的:
program test
implicit none
real*4,dimension(19)::csc_data=(/10.,3.,3.,9.,7.,8.,4.,8.,8.,7.,7.,9.,-2.,5.,9.,2.,3.,13.,-1./)
integer*4,dimension(19)::csc_index=(/1,2,4,2,3,5,6,3,4,3,4,5,1,4,5,6,2,5,6/)
integer*4,dimension(7)::csc_pointer=(/1,4,8,10,13,17,20/)
integer*4,dimension(7)::csr_pointer
integer*4,dimension(19)::csr_index
real*4,dimension(19)::csr_data
integer*4::global_counter,counter,i
integer*4::num_nonzero,num_cols,num_rows
integer*4::s1,s2,c,r
num_nonzero=19
num_rows=6
num_cols=6
csr_pointer(1)=1
global_counter=1
do i=1,num_rows
counter=0
do c=1,num_cols
s1=csc_pointer(c)
s2=csc_pointer(c+1)-1
do r=s1,s2
if(csc_index(r).eq.i) then
counter=counter+1
csr_data(global_counter)=csc_data(r)
csr_index(global_counter)=c
global_counter=global_counter+1
end if
end do
end do
csr_pointer(i+1)=csr_pointer(i)+counter
end do
end program test
有人能表现出更有效的方法吗?如果您也可以使用OpenMP并行化显示它,我将非常感激。感谢。
答案 0 :(得分:0)
虽然我无法评论算法的正确性,但我可以在代码本身上提出几点意见
csc_data
定义为real*4
,而csr_data
定义为integer*4
csc_pointer
定义为integer*4
,而csr_pointer
定义为real*4
csr_index
的索引为global_i
,应为global_counter