배열을 열 주요 순서로 저장하는 언어로 작업한다고 가정합니다. 또한 2 차원 배열을 인수로 사용하여이를 반환하는 함수가 있다고 가정합니다. 행렬 연산 대신 열 단위 연산을 사용하기 위해 함수를 호출 할 때이 배열을 조인하는 것이 일반적으로 도움이되는지 (또는 그렇지 않은지) 궁금합니다. 또는 이항 변환은 열 단위 작업의 이점? I n x p
치수, 즉를 갖는다 y
라는 클래스의 TS 오브젝트가 R의 예로서 열 단위 연산을 사용하기 위해 배열을 조 변경하는 것이 유리합니까?
n
p
의 시간 시리즈가있다. 포트란 (처럼 R)를 열 현명한 스토리지를 사용하기 때문에
이
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
, 더 나은 것 :
이 나는 구조의 다음과 같은 종류의 두 개의 루프가 포트란에서 y
와 함께 몇 가지 계산을 할 필요가 그 대신 계산을 p x n
배열로합니다. 그래서 그 대신
out<-.Fortran("something",y=array(y,dim(y)),x=array(0,dim(y)))
ynew<-out$out$y
x<-out$out$x
의 나는 포트란 서브 루틴 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
또는이다
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)
사용할 수 있습니다 하나의 접근법이 계산 속도 및/또는 메모리 요구 사항면에서 더 낫다고 말할 수 있습니까? 내 응용 프로그램에서 n
은 일반적으로 p
보다 훨씬 큽니다. 대부분의 경우 1에서 10입니다. 당신은 본질적으로
y(1:p,i)
단순히 Y에 대한 포인터 (1 같이 두 번째 방법을 사용하도록 강요 될 것이다 오래된 학교 F77 아래 : 주석의
많은 경우에 루프의 순서를 교환 할 수 있습니다. 거기에 어떤 의존성이 있습니까? –
예, 순환 순서를 다루고 있으므로 루프 순서를 변경할 수 없다는 점을 잊어 버렸습니다. –
이것이 실제로 문제가됩니까? R이 해석되기 때문에 어쨌든 1-2 배 정도 느려지므로 Fortran에서 10 % 미만의 시간을 보내고 있다면 해결할 수있는 시간이 더 많을 가능성이 있습니다. –