-1

我试图使用 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 并行化来展示它,我将不胜感激。谢谢。

4

1 回答 1

0

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

  • csc_data定义为real*4whilecsr_data定义为integer*4
  • csc_pointer定义为integer*4whilecsr_pointer定义为real*4
  • 如果您输出数据,除了整数/实数差异之外,数据是相同的,我不希望转换矩阵
  • csr_index有一个索引global_i应该是global_counter
于 2013-07-04T15:46:16.300 回答