稀疏矩阵格式"New Yale"的详细信息?



有些Netlib代码是用Fortran编写的,它在稀疏矩阵上执行转置和乘法。该图书馆采用史密斯银行(有点)、"旧耶鲁"one_answers"新耶鲁"格式。

不幸的是,我没能找到关于"新耶鲁"的太多细节。我实现了我认为符合论文描述的内容,我可以适当地获取和设置条目。

但是结果不正确,这让我怀疑我是否实现了与论文中的描述相匹配的东西,但不是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一样编写。

我看不出你是如何从那篇论文中推导出这些向量的。首先是旧耶鲁格式:

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的新排序(我提出了|来澄清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

因此,首先,SMMP论文中给出的参考文献可能不是正确的。我昨晚从图书馆查了一下(裁判)。它似乎给出了"旧耶鲁"的格式。在第49-50页中,它确实提到了对角线可以从矩阵的其余部分中分离出来,但并没有提到IJA向量。

我找到了1992年版《C数字食谱》第78-79页中描述的格式。

当然,不能保证这是Netlib中SMMP库所接受的格式。

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

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

相关内容

最新更新