假设我们正在使用一种以列优先顺序存储数组的语言。还假设我们有一个使用二维数组作为参数的函数,并返回它。我想知道您是否可以声称在调用函数时转置此数组通常是(或不是)有益的,以便使用按列操作而不是按行操作,或者转置是否否定了列操作的好处?
例如,在 RI 中有一个名为 ts 的对象,y
它具有维度n x p
,即我有p
长度的时间序列n
。
我需要y
在 Fortran 中进行一些计算,其中我有两个具有以下结构的循环:
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
或者是否可以说一种方法在计算速度和/或内存要求方面更好?在我的应用程序n
中通常比 大得多p
,在大多数情况下是 1 到 10。