开始一个循环,另一个停止

时间:2014-03-14 14:38:28

标签: loops fortran

我有一个内部展开稀疏矩阵向量乘法的循环。我们使用对角线方法计算右上方矩阵,每条对角线的长度不同。

然后展开按行进行,即我一次计算几个对角线,直到最短的对角线到达矩阵的末端。然后我想用另一个减少展开长度的循环来计算剩余的对角线。

这导致第二个循环需要在第一个循环结束的地方开始的问题。我现在磕磕绊绊的结构如下(非常简化):

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是否有效?或者这种循环索引处理有更好的方法吗?

1 个答案:

答案 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>