【问题标题】:Performing storage of banded matrix in Fortran在 Fortran 中执行带状矩阵的存储
【发布时间】:2016-08-03 10:06:07
【问题描述】:

我编写了一个派生数据类型来以压缩对角存储格式存储带状矩阵;特别是我将带状矩阵的每个对角线存储在二维数组cds(1:N,-L:U) 中,其中N 是完整矩阵的行数,LU 是上下对角线的数量(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

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

【问题讨论】:

  • 这在很大程度上取决于矩阵乘法如何访问行和列。
  • 是的,从您的示例看来,其他顺序可能会更快。您可以尝试测量。也许其他库的计算方式不同?

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2015-01-19
    • 2011-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2017-04-28
    • 1970-01-01
    相关资源
    最近更新 更多