在Fortran中执行带状矩阵的存储

时间:2016-08-03 10:06:07

标签: fortran storage sparse-matrix matrix-multiplication derived-types

我编写了一个派生数据类型来存储压缩对角线存储格式的带状矩阵;特别是我将带状矩阵的每个对角线存储在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 + qDO 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.

1 个答案:

答案 0 :(得分:0)

我实现了派生类型,它将对角线存储在数组val(-p:q,1:n)中,并且它比我想象的更快。所以我认为我引用的链接将行主要存储语言称为C而不是作为Fortran的列主要存储语言。 (或者它以我甚至无法想象的方式实现矩阵产品。)