在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一样编写。
答案 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]
IA
和JA
合并在IJA
中,但据我在论文中可以看出,您需要考虑A的新顺序(我已经放|
1}}澄清IA
和JA
之间的分离:
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标准)。
行长度不包括非零对角线条目。