2013-07-04 40 views
-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并行化来展示它,我将非常感激。谢谢。

+0

如何改变从列为主向行主要一维数组? –

+1

@KyleKanos OP正在讨论格式之间的稀疏矩阵转换,请参阅http://en.wikipedia.org/wiki/Sparse_matrix#Compressed_sparse_row_.28CSR_or_CRS.29。 – milancurcic

+1

如果你的代码有效,但效率不如你想要的,这个问题更适合于http://codereview.stackexchange.com/ – milancurcic

回答

0

虽然我不能对算法的正确性进行评论,我可以让代码本身

  • csc_data几个点被定义为real*4csr_data被定义为integer*4
  • csc_pointer被定义为integer*4csr_pointer被定义为real*4
  • 如果你输出的数据,除了整数/实际差异,数据是相同的,我不希望转换m ATRIX
  • csr_indexglobal_i的指数应该是global_counter
+0

感谢您注意到错别字,编辑。 – tiki

+0

@HighPerformanceMark我改变了这个例子,但实际上我打算在更大的情况下运行它......谢谢。 – tiki