我编写了一个派生数据类型来存储压缩对角线存储格式的带状矩阵;特别是我将带状矩阵的每个对角线存储在2D数组cds(1:N,-L:U)
的列中,其中N
是完整矩阵的行数和{{1} }和L
是下对角线和上对角线的数量(this question包括类型的定义)。
我还编写了一个函数,用于在此CDS格式的矩阵和完整向量之间执行产品。为了获得产品向量的每个元素,使用相应行U
的元素,这些元素在内存中不连续,因为语言是Fortran。因此,如果更好的解决方案是将对角线存储在2D数组cds
的行中,我就会徘徊,这对我来说似乎很合理。
相反here我读了
我们可以为矩阵
cds2(-L:U,1:N)
分配一个数组A
。反向维度val(1:n,-p:q)
的声明对应于LINPACK带格式[132],与压缩对角线存储(CDS)不同,如果{{1}不允许有效的可矢量化矩阵向量乘法很小。
在我看来,这正是C所适合的。我错过了什么?
修改
执行矩阵向量积的例程的核心如下
(-p:q,n)
(其中p + q
和DO i = A%lb(1), A%ub(1)
CDS_mat_x_full_vec(i) = DOT_PRODUCT(A%matrix(i,max(-lband,lv-i):min(uband,uv-i)), &
& v(max(i-lband,lv):min(i+uband,uv)))
END DO
用于考虑从1以外的索引索引的向量的情况。)
然后按行访问矩阵A.
答案 0 :(得分:0)
我实现了派生类型,它将对角线存储在数组val(-p:q,1:n)
中,并且它比我想象的更快。所以我认为我引用的链接将行主要存储语言称为C而不是作为Fortran的列主要存储语言。 (或者它以我甚至无法想象的方式实现矩阵产品。)