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

Performing storage of banded matrix in Fortran

我写了一个派生数据类型来以压缩对角线存储格式存储带状矩阵;特别是,我将带状矩阵的每个对角线存储在二维数组 cds(1:N,-L:U) 中,其中 N 是完整矩阵的行数 LU是上下对角线的个数(包括类型的定义)。

我还编写了一个函数来执行此 CDS 格式的矩阵与完整向量之间的乘积。为了获得乘积向量的每个元素,使用了 cds 对应行的元素,这些元素在内存中是不连续的,因为语言是 Fortran。因此,我在徘徊是否有更好的解决方案是将对角线存储在二维数组 cds2(-L:U,1:N) 中,这对我来说似乎很合理。

相反here我看了

we can allocate for the matrix A an array val(1:n,-p:q). The declaration with reversed dimensions (-p:q,n) corresponds to the LINPACK band format [132], which, unlike compressed diagonal storage (CDS), does not allow for an efficiently vectorizable matrix-vector multiplication if p + q is small.

在我看来,这似乎适合 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

(其中 lvuv 用于考虑从 1 以外的索引索引的向量的情况。) 然后按行访问矩阵 A。

我实现了将对角线存储在数组 val(-p:q,1:n) 中的派生类型,而且它更快,正如我所想的那样。所以我认为我引用的 link 指的是一种行主存储语言,如 C,而不是列主存储语言,如 Fortran。 (或者它以我无法想象的方式实现了矩阵乘积。)