Fortran在任意索引上进行循环,例如R中的for循环?

时间:2012-03-19 16:22:17

标签: r loops if-statement fortran

我有两个p-times-n数组xmissx,其中x包含任意数字,missx是包含零和1的数组。我需要对missx为零的那些点执行递归计算。显而易见的解决方案是这样的:

do i = 1, n
   do j = 1, p
      if(missx(j,i)==0) then
         z(j,i) = ... something depending on the previous computations and x(j,i)
      end if
   end do
end do

这种方法的问题是大多数时候missx总是为0,因此有很多if语句总是正确的。

在R中,我会这样做:

for(i in 1:n)
  for(j in which(xmiss[,i]==0))
     z[j,i] <- ... something depending on the previous computations and x[j,i]

有没有办法在Fortran中进行内循环?我确实试过这样的版本:

do i = 1, n
   do j = 1, xlength(i) !xlength(i) gives the number of zero-elements in x(,i)
     j2=whichx(j,i) !whichx(1:xlength(i),i) contains the indices of zero-elements in x(,i)
     z(j2,i) = ... something depending on the previous computations and x(j,i)
   end do
end do

这似乎比第一个解决方案稍快(如果不计算定义xlengthwhichx的数量),但是有更聪明的方式就像R版本一样,所以我不会我需要存储那些xlengthwhichx数组吗?

1 个答案:

答案 0 :(得分:5)

我认为无论如何你都不会获得显着的加速,如果你必须对大多数项进行迭代,那么只存储整个数组的0值列表不是一个选项。您当然可以使用WHEREFORALL构造。

forall(i = 1: n,j = 1: p,miss(j,i)==0) z(j,i) = ...

或只是

where(miss==0) z = ..

但这些结构的存在局限性适用。