【问题标题】:Fortran element wise multiplication of a matrix and a vector矩阵和向量的 Fortran 元素乘法
【发布时间】:2019-12-10 14:17:13
【问题描述】:

有没有一种简单快捷的方法将矩阵的列与向量的元素相乘。我们可以明确地做到这一点,

program test
   integer :: x(3,3), y(3), z(3,3)
   x = reshape([(i,i=1,9)],[3,3])
   y = [1,2,3]
   do i=1,3
      z(:,i) = x(:,i) * y(i)
      print *, z(:,i)
   enddo
end program test

有没有办法在一行中执行 do 循环。例如在 Numpy python 中,我们可以一次性完成这项工作

z = np.einsum('ij,i->ij',x,y)
#or
z = x*y[:,None]

【问题讨论】:

    标签: fortran


    【解决方案1】:

    试试

    z = x * spread(y,1,3)
    

    如果这不起作用(这台计算机上没有 Fortran,所以我没有检查)摆弄 spread 直到它起作用。在实践中,您可能希望将 3 替换为 size(x,1) 或类似的。

    我希望这会导致编译器创建临时数组。而且我希望很容易找到它在问题中的显式循环方案表现不佳的情况。 “整洁”的单线通常在时间和空间上都有成本。并且经常尝试和信任的显式循环的 Fortran 方法是一种可以使用的方法。

    【讨论】:

    • 那么,它会创建中间数组吗?如果我正在使用大型数组,那么它会牺牲计算时间和内存吗?
    【解决方案2】:

    为什么用垃圾代替清晰易读的代码?

    program test
      implicit none
      integer i,j
      integer :: x(3,3), y(3), z(3,3)
      x = reshape([(i,i=1,9)],[3,3])
      y = [1,2,3]
      z = reshape ([((x(j,i)*y(i) ,j=1,3),i=1,3)], [3,3])
      print *, z(1,:)
      print *, z(2,:)
      print *, z(3,:)
    end program test
    

    【讨论】:

      猜你喜欢
      • 2011-12-13
      • 1970-01-01
      • 1970-01-01
      • 2014-10-23
      • 2019-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-15
      相关资源
      最近更新 更多