有些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]
IA
和JA
组合在IJA
中,但据我所知,你需要考虑A的新排序(我提出了|
来澄清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
。
因此,首先,SMMP论文中给出的参考文献可能不是正确的。我昨晚从图书馆查了一下(裁判)。它似乎给出了"旧耶鲁"的格式。在第49-50页中,它确实提到了对角线可以从矩阵的其余部分中分离出来,但并没有提到IJA向量。
我找到了1992年版《C数字食谱》第78-79页中描述的格式。
当然,不能保证这是Netlib中SMMP库所接受的格式。
NR似乎具有相对于IJA的IA给予位置,而不是相对于JA。IA部分中的最后一个位置给出的不是IJA和A向量的大小,而是size-1
,因为向量从1开始索引(根据Fortran标准)。
行长度不包括非零对角线条目。