Fortran 90/95中的广播数组乘法

时间:2015-01-15 17:16:17

标签: arrays fortran fortran90

我想知道在Fortran中有更好的(简洁的)方法吗?我正在尝试将a(3, 3)的每一列乘以b(3)中的每个值。我知道在Python中有np.multiply,而且对Fortran不确定。

!!! 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

提前致谢!

3 个答案:

答案 0 :(得分:5)

表达式

a * SPREAD(b,1,3)

将产生与循环相同的结果。我会留给你和其他人来判断这是否比循环更简洁或更好。

答案 1 :(得分:3)

do循环可以使用FORALL替换为单行:

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

答案 2 :(得分:1)

如果您经常重复使用特定的b,您可以定义:

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

那么你就可以做到:

 a=a*b

...