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

Arrays Fortran 90/95中的广播数组乘法,arrays,fortran,fortran90,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]),&a

我想知道有没有更好的(简洁的)方法来用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

提前谢谢

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

 b(3, 3)=reshape([1, 1, 1, 2, 2, 2, 3, 3, 3], [3, 3])
然后你就可以做:

 a=a*b
..

表达式

a * SPREAD(b,1,3)

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

使用FORALL,do循环可以由一行程序代替:

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

谢谢你的回答!这绝对是“标准”的做法。也谢谢你的评论。你是对的,这种写作方式比较短,但更难理解。更重要的是,它复制阵列,因此效率可能较低。这是否是一种更好的做法仍有待商榷。如果真正的问题是小的
3x3
矩阵或更大的矩阵,则可能会产生很大的不同。我不确定这是实现所需目标的标准方法。在我看来,循环仍然是Fortran的标准操作方式。有时正确,有时错误。