【发布时间】:2016-08-03 10:06:07
【问题描述】:
我编写了一个派生数据类型来以压缩对角存储格式存储带状矩阵;特别是我将带状矩阵的每个对角线存储在二维数组cds(1:N,-L:U) 的列 中,其中N 是完整矩阵的行数,L 和U 是上下对角线的数量(this question 包括类型的定义)。
我还编写了一个函数来执行这种 CDS 格式的矩阵和完整向量之间的乘积。为了获取乘积向量的每个元素,使用cds 对应行的元素,这些元素在内存中不连续,因为语言是Fortran。因此,如果更好的解决方案是将对角线存储在 2D 数组 cds2(-L:U,1:N) 的 rows 中,我一直在徘徊,这对我来说似乎很合理。
相反here我看了
我们可以为矩阵
A分配一个数组val(1:n,-p:q)。具有反转维度的声明(-p:q,n)对应于 LINPACK 带格式 [132],与压缩对角存储 (CDS) 不同,如果p + q很小,则它不允许有效的向量化矩阵向量乘法。
在我看来,这对 C 来说是合适的。我错过了什么?
编辑
执行矩阵向量乘积的例程核心如下
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
(其中lv 和uv 用于考虑从非1索引索引的向量的情况。)
然后按行访问矩阵 A。
【问题讨论】:
-
这在很大程度上取决于矩阵乘法如何访问行和列。
-
是的,从您的示例看来,其他顺序可能会更快。您可以尝试测量。也许其他库的计算方式不同?
标签: fortran storage sparse-matrix matrix-multiplication derived-types