【问题标题】:Broadcast array multiplication in Fortran 90/95Fortran 90/95 中的广播数组乘法
【发布时间】:2015-03-14 04:25:14
【问题描述】:

我想知道在 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

提前致谢!

【问题讨论】:

    标签: arrays fortran fortran90


    【解决方案1】:

    表达式

    a * SPREAD(b,1,3)
    

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

    【讨论】:

    • 感谢您的回答!这绝对是做到这一点的“标准”方式。也感谢您的评论。你是对的,这种写法更短,但更难理解。更重要的是,它会复制数组,因此效率可能会降低。这是否是一种更好的做法仍有待商榷。
    • 如果真正的问题是小的3x3 矩阵或更大的矩阵,它可能会产生很大的不同。
    • 我不确定这是实现预期目标的标准方式。在我看来,循环仍然是 Fortran 中做事的标准方式。有时正确,有时错误。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      那么你可以这样做:

       a=a*b
      

      ..

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-30
        • 2015-06-17
        • 2012-12-21
        • 2020-05-01
        相关资源
        最近更新 更多