2013-07-04 41 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