“新耶鲁”稀疏矩阵格式的细节?

时间:2012-02-09 00:25:38

标签: data-structures fortran sparse-matrix matrix-multiplication

在Fortran中编写了一些Netlib代码,它对稀疏矩阵执行转置和乘法运算。该图书馆与Bank-Smith(有点),“耶鲁大学”和“新耶鲁”格式合作。

不幸的是,我无法找到关于“新耶鲁”的更多细节。我实现了我认为与描述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 个答案:

答案 0 :(得分: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中,但据我在论文中可以看出,您需要考虑A的新顺序(我已经放| 1}}澄清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。然后是非零非对角元素的列索引,即{{1}}。

答案 1 :(得分:2)

因此,首先,the SMMP paper中给出的引用可能不正确。我昨晚从图书馆checked it out(参考)。它似乎给出了“旧耶鲁”格式。它确实在第49-50页提到,对角线可以从矩阵的其余部分中分离出来 - 但并没有提到IJA向量。

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

当然,无法保证这是Netlib的SMMP库接受的格式。

NR 似乎有IA给予相对于IJA的职位,而不是相对于JA。 IA部分中的最后一个位置不是IJA和A矢量的大小,而是size-1,因为矢量从1开始索引(根据Fortran标准)。

行长度不包括非零对角线条目。