У меня есть два массива p-times-n x
и missx
, где x
содержит произвольные числа, а missx
- массив, содержащий нули и единицы. Мне нужно выполнить рекурсивные вычисления в тех точках, где 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]
Есть ли способ сделать такой внутренний цикл в Фортране? Я попробовал такую версию:
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
Это казалось немного быстрее, чем первое решение (если не считать количество определяющих xlength
и whichx
), но есть ли какой-нибудь более умный способ для этого, как версия R, поэтому мне не нужно было бы хранить эти xlength
и whichx
массивы?