2012-03-19 7 views
2

私は2つのp倍n配列xmissxを持っています。ここで、xは任意の数を含み、missxは0と1を含む配列です。 missxがゼロである点で再帰的計算を実行する必要があります。明白な解決策は次のように次のようになります。このアプローチのRのfor-loopのような任意のインデックスに対するFortranのdo-loop?

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で

、私はこのようにそれを行うだろう:Fortranでそのような内部ループを行う方法が

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 

これは(xlengthwhichxを定義するの量をカウントしない場合)最初のソリューションよりも若干速いように見えたが、Rのバージョンのようにこれにいくつかのより多くの巧妙な方法がありますだから私はそれらのxlengthwhichxアレイを格納する必要はありませんか?

答えて

5

ほとんどのアイテムの繰り返しを行う必要がある場合は、配列全体の0の値を持つリストだけを格納することはオプションではありません。もちろん、WHEREまたはFORALL構成を使用することができます。

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

か、単に

where(miss==0) z = .. 

しかし、これらの構築物のussual制限が適用されます。

+0

ありがとうございます。 –

関連する問題