有没有办法在Fortran中关联数组切片索引?

时间:2019-05-03 19:16:31

标签: fortran

我正在实现一个将向量乘以矩阵的函数。

矩阵以CSR(压缩稀疏行)格式存储:

type csr_matrix ! Compressed Sparse Row
    integer, dimension(:), allocatable :: row_offsets ! dimension(nrows + 1)
    integer, dimension(:), allocatable :: columns ! dimension(nnz)
    real(dp), dimension(:), allocatable :: values ! dimension(nnz)
end type

下面的代码可以成功编译并正常工作:

res = 0
do i = 1, size(b)
    associate( &
        lbound => A%row_offsets(i) + 1, &
        ubound => A%row_offsets(i + 1) &
        )
        res(i) = res(i) + dot_product(A%values(lbound:ubound), b(A%columns(lbound:ubound)))
    end associate
end do

lbound:ubound表达式出现了两次,所以我认为最好通过将lboundubound的关联替换为单个slice_ind的关联来重构代码:< / p>

res = 0
do i = 1, size(b)
    associate(slice_ind => A%row_offsets(i) + 1 : A%row_offsets(i + 1))
        res(i) = res(i) + dot_product(A%values(slice_ind), b(A%columns(slice_ind)))
    end associate
end do

但是编译器会产生错误:

error #5082: Syntax error, found ':' when expecting one of: ) ,

有没有办法在fortran中进行这种关联?如果没有,是否有更好的方法使代码更具可读性?

1 个答案:

答案 0 :(得分:2)

否,不可能,代码无效。制作子数组(数组部分)时或在某些声明和分配的:中,只能使用::

您必须将版本与标量lboundubound一起使用。通常,无法将数组索引表达式(单个或多个维)存储在变量或数组中。一维向量索引是一个例外,其中数组包含所有索引。