2

Fortran編寫的一些Netlib代碼可以在稀疏矩陣上執行轉置和乘法。該圖書館與銀行史密斯(有些),「老耶魯」和「新耶魯」格式。「新耶魯」稀疏矩陣格式的詳細信息?

不幸的是,我一直沒能找到關於「新耶魯」的更多細節。我實現了我認爲符合描述given in the paper的內容,並且我可以正確地獲取和設置條目。

但結果不正確,導致我懷疑是否已經實現了與論文中的描述相匹配的內容,但不是Fortran代碼所期望的內容。

那麼幾個問題:

應該排長度包括對角線元素?例如,如果你有M=[1,1;0,1],似乎它應該是這樣的:

IJA = [3,4,4,1] 
A = [1,1,X,1] // where X=NULL 

看來,如果包含在列長度對角線項,你會得到這樣的事情:

IJA = [3,5,6,1] 
A = [1,1,X,1] 

這沒有多大意義,因爲IJA[2]=6應該是IJA/A陣列的大小,但它紙張似乎在說什麼。

矩陣是否應該使用基於1的索引?

畢竟它是Fortran代碼。也許,而不是我的IJA和A應該是這樣的:

IJA = [4,5,5,2] 
A = [1,1,X,1] // still X=NULL 

還有什麼我失蹤?

是的,這是模糊的,但我認爲扔在那裏,以防有人誰已與該代碼搞砸之前想主動提供任何其他信息。任何人都可以隨意忽略這最後一個問題。

我知道這些問題可能看起來相當微不足道,但我想也許一些Fortran人可以爲我提供一些見解。我不習慣在一個基於系統的系統中思考,雖然我已經使用f2c將代碼轉換爲C,但它仍然像Fortran一樣編寫。

回答

2

因此,首先,the SMMP paper中給出的參考可能不是正確的。我昨晚從圖書館拿到了checked it out(裁判)。它似乎給了「老耶魯」格式。它在第49-50頁中提到,對角線可以從矩陣的其餘部分分離出來 - 但並不像提及IJA向量那樣。

我能夠找到1992年版Numerical Recipes in C第78-79頁中描述的格式。

當然,不能保證這是Netlib的SMMP庫接受的格式。

NR似乎有IA提供相對於IJA的位置,而不是相對於JA。 IA部分中的最後一個位置不給出IJA和A向量的大小,但由於向量從1開始索引(每個Fortran標準),因此不會產生IJA和A向量的大小。

行長度不包括非零對角線條目。

3

我看不出你是如何從那篇論文中推導出這些向量的。第一舊耶魯格式:

M = [7,16;0,-12] 

然後,A包含行形式M的所有非零值: A = [7,16,-12]

IA存儲在位置各行的第一要素A,和JA存儲所有的值的列索引在A

IA = [1,3,4] 
JA = [1,2,2] 

新格式:A第一有對角線值,零和叔母雞剩餘非零元素(我已經把|澄清之間的分離 - 對角線和非對角線):

A = [7,-12,0 | 16] 

IAJA組合在IJA,但據我可以從紙張告訴你需要考慮到的新的排序(我已經把|澄清IAJA之間的分離 - ):

IJA = [1,2,3 | 2] 

因此,適用於你的情況M = [1,1;0,1],我得到

A = [1,1,0 | 1] 
IJA = [1,2,3 | 2] 

的第一行的第一個元素是在A所述第一和第二行的第一個元素是在A第二,然後我把3因爲他們說行的長度由IA(I)-IA(I+1)確定的,所以我確定區別是1。然後,非零非對角線元素的列索引跟隨,即2

+0

有趣。你在論文中解釋說明與I完全不同。看起來最大的不同是IA位置是否應該相對於JA或相對於IJA。 昨天晚上我在圖書館做了一些更多的研究,所以我會發布我發現的一個單獨的答案,並把它變成一個Wiki,我想。 – 2012-02-09 17:23:14