在 Fortran 中执行带状矩阵的存储
Performing storage of banded matrix in Fortran
我写了一个派生数据类型来以压缩对角线存储格式存储带状矩阵;特别是,我将带状矩阵的每个对角线存储在二维数组 cds(1:N,-L:U)
的 列 中,其中 N
是完整矩阵的行数 L
和U
是上下对角线的个数(包括类型的定义)。
我还编写了一个函数来执行此 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
(其中 lv
和 uv
用于考虑从 1 以外的索引索引的向量的情况。)
然后按行访问矩阵 A。
我实现了将对角线存储在数组 val(-p:q,1:n)
中的派生类型,而且它更快,正如我所想的那样。所以我认为我引用的 link 指的是一种行主存储语言,如 C,而不是列主存储语言,如 Fortran。 (或者它以我无法想象的方式实现了矩阵乘积。)
我写了一个派生数据类型来以压缩对角线存储格式存储带状矩阵;特别是,我将带状矩阵的每个对角线存储在二维数组 cds(1:N,-L:U)
的 列 中,其中 N
是完整矩阵的行数 L
和U
是上下对角线的个数(
我还编写了一个函数来执行此 CDS 格式的矩阵与完整向量之间的乘积。为了获得乘积向量的每个元素,使用了 cds
对应行的元素,这些元素在内存中是不连续的,因为语言是 Fortran。因此,我在徘徊是否有更好的解决方案是将对角线存储在二维数组 cds2(-L:U,1:N)
的 行 中,这对我来说似乎很合理。
相反here我看了
we can allocate for the matrix
A
an arrayval(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 ifp + 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
(其中 lv
和 uv
用于考虑从 1 以外的索引索引的向量的情况。)
然后按行访问矩阵 A。
我实现了将对角线存储在数组 val(-p:q,1:n)
中的派生类型,而且它更快,正如我所想的那样。所以我认为我引用的 link 指的是一种行主存储语言,如 C,而不是列主存储语言,如 Fortran。 (或者它以我无法想象的方式实现了矩阵乘积。)