配列を列優先の順序で格納する言語を使用していると仮定します。また、2次元配列を引数として使用し、それを返す関数があるとします。行単位の操作ではなく列単位の操作を処理するために関数を呼び出すときにこの配列を転置することが一般的に有益である(またはそうでない)と主張できますか、または転置は列単位の操作の利点は?
y
例として、RIには、次元を持つ名前のクラスtsのオブジェクトがあります。n x p
つまりp
、長さの時系列がありn
ます。
私はFortranでいくつかの計算を行う必要がありy
ます。ここでは、次の種類の構造を持つ2つのループがあります。
do i = 1, n
do j= 1, p
!just an example, some row-wise operations on `y`
x(i,j) = a*y(i,j)
D = ddot(m,y(i,1:p),1,b,1)
! ...
end do
end do
Fortranは(Rと同様に)列単位のストレージを使用するため、p x n
代わりに配列を使用して計算を行う方が適切です。だから代わりに
out<-.Fortran("something",y=array(y,dim(y)),x=array(0,dim(y)))
ynew<-out$out$y
x<-out$out$x
使用できます
out<-.Fortran("something2",y=t(array(y,dim(y))),x=array(0,dim(y)[2:1]))
ynew<-t(out$out$y)
x<-t(out$out$x)
ここで、Fortranサブルーチンsomething2
は次のようになります。
do i = 1, n
do j= 1, p
!just an example, some column-wise operations on `y`
x(j,i) = a*y(j,i)
D = ddot(m,y(1:p,i),1,b,1)
! ...
end do
end do
n
アプローチの選択は常にディメンションに依存しますp
か、または計算速度やメモリ要件の観点から1つのアプローチの方が優れていると言えますか?私のアプリケーションn
では、通常、よりもはるかに大きくp
、ほとんどの場合1〜10です。