我正在实现一个将向量乘以矩阵的函数。
矩阵以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
表达式出现了两次,所以我认为最好通过将lbound
和ubound
的关联替换为单个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中进行这种关联?如果没有,是否有更好的方法使代码更具可读性?
答案 0 :(得分:2)
否,不可能,代码无效。制作子数组(数组部分)时或在某些声明和分配的:
中,只能使用::
。
您必须将版本与标量lbound
和ubound
一起使用。通常,无法将数组索引表达式(单个或多个维)存储在变量或数组中。一维向量索引是一个例外,其中数组包含所有索引。