2012-03-19 64 views
2

我有兩個p-times-n數組xmissx,其中x包含任意數字,missx是一個包含零和1的數組。我需要對missx爲零的那些點執行遞歸計算。明顯的解決辦法是這樣的:Fortran的do循環在R中的任意循環如for循環?

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數組?

回答

5

無論如何,如果您必須對大多數項目進行迭代,我不認爲您會獲得戲劇性的加速,而不是僅僅爲整個數組存儲0值的列表不是一種選擇。您當然可以使用WHEREFORALL構造。

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

或只是

where(miss==0) z = .. 

但是這些結構的ussual限制適用。

+0

謝謝,我會檢查在哪裏構造。 – 2012-03-20 05:17:35