压缩稀疏列到行的转换

时间:2013-07-04 13:32:21

标签: fortran openmp

我试图使用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并行化显示它,我将非常感激。感谢。

1 个答案:

答案 0 :(得分:0)

虽然我无法评论算法的正确性,但我可以在代码本身上提出几点意见

  • csc_data定义为real*4,而csr_data定义为integer*4
  • csc_pointer定义为integer*4,而csr_pointer定义为real*4
  • 如果输出数据,除了形成整数/实数差异外,数据是相同的,我不希望转换矩阵
  • csr_index的索引为global_i,应为global_counter