Do-цикл Фортрана над произвольными индексами, такими как цикл for в R? - PullRequest
2 голосов
/ 19 марта 2012

У меня есть два массива 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 массивы?

1 Ответ

5 голосов
/ 19 марта 2012

Я не думаю, что вы все равно получите резкое ускорение, если вы должны выполнить итерацию для большинства элементов, тогда сохранение только списка из них со значением 0 для всего массива не вариант.Конечно, вы можете использовать конструкцию WHERE или FORALL.

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

или просто

where(miss==0) z = ..

Но применяются обычные ограничения этих конструкций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...