我有一个内部展开稀疏矩阵向量乘法的循环。我们使用对角线方法计算右上方矩阵,每条对角线的长度不同。
然后展开按行进行,即我一次计算几个对角线,直到最短的对角线到达矩阵的末端。然后我想用另一个减少展开长度的循环来计算剩余的对角线。
这导致第二个循环需要在第一个循环结束的地方开始的问题。我现在磕磕绊绊的结构如下(非常简化):
do diag=1, nDiagonals-3, 4
! here be dragons
end do
do diag=diag, nDiagonals-2, 3
! here be smaller dragons
end do
在Fortran中,必须在控制子句中设置do索引,而不是C,其中for(;n<m;==n)
是可能的循环控制子句。但上面的结构do index=index, upperbound
是否有效?或者这种循环索引处理有更好的方法吗?
答案 0 :(得分:3)
我看不到你的代码在语法上有什么问题,如果合法,我也不认为你做了任何危险的事情。
在第一个循环结束后,diag
将具有循环继续一次迭代时所具有的值。此行为由标准定义。鉴于片段
do diag = start, stop, stride
! do stuff
end do
循环结束时的 diag
的值等于(start + n*stride)
,其中n
是最小的整数,(start + n*stride)>stop
所以,对于像
这样的循环do diag = 1,10,3
! do stuff
end do
! now diag == 13
你可以继续使用它来开始下一个循环。
在Fortran中,你不能做的是调整循环内do变量的值,编译器的行为就像它在第一次遇到do
语句时建立循环限制一样。 / p>