2015-01-15 7 views
3

포트란에서 이것을 코딩하는 더 좋은 (간결한) 방법이 있을까? a(3, 3)의 각 열에 b(3)의 각 값을 곱하려고합니다. 나는 파이썬에서 np.multiply이 있고, 포트란에 대해서는 확실하지 않다는 것을 알고있다.포트란 90/95에서 방송 배열 곱셈

!!! test.f90 
program test 
    implicit none 
    integer, parameter :: dp=kind(0.d0) 
    real(dp) :: a(3, 3)=reshape([1, 2, 3, 4, 5, 6, 7, 8, 9], [3, 3]),& 
     b(3)=[1, 2, 3] 
    integer :: i 
    do i = 1, 3 
     a(:, i) = a(:, i) * b(i) 
    end do 
    write(*, *) a 
end program test 

미리 감사드립니다. 특정 B를 재사용하는 경우

답변

5

표현을

a * SPREAD(b,1,3) 

은 루프와 같은 결과. 나는 이것이 당신보다 더 간결한가 또는 어떤 방식 으로든 루프보다 나은지 판단하기 위해 다른 사람들에게 남겨 둘 것입니다.

+0

감사합니다! 이것은 절대적으로 "표준"방법입니다. 또한 귀하의 의견을 주셔서 감사합니다. 당신은 옳습니다.이 글쓰기 방법은 더 짧지 만 이해하기가 더 어렵습니다. 더 중요한 것은 배열을 복사하므로 효율성이 떨어질 수 있습니다. 이것이 더 나은 관행인지는 여전히 의문의 여지가 있습니다. –

+0

실제 문제가 거의 '3x3'행렬 또는 훨씬 큰 행렬 일 경우 큰 차이가 날 것입니다. – agentp

+0

이것이 원하는 목적을 달성하는 표준 * 방법이라고 확신하지 않습니다. 루프는 여전히 포트란에서 일하는 표준 방법입니다. 때로는 때로는 잘못되었습니다. –

1

자주 당신은 정의 할 수 있습니다 :

b(3, 3)=reshape([1, 1, 1, 2, 2, 2, 3, 3, 3], [3, 3]) 

는 다음 방금 수행 할 수 있습니다

a=a*b 

..

3

(가) 루프를 할 수는 FORALL 사용하여 한 줄에 의해 대체 될 수 있습니다 대답에 대한

forall (i=1:3) a(:, i) = a(:, i) * b(i)