矩阵和向量的Fortran元素相乘

矩阵和向量的Fortran元素相乘,fortran,Fortran,有一种简单而快速的方法可以将矩阵的一列与向量的元素相乘。我们可以明确地做到这一点 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循环。例如

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

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循环。例如,在numpython中,我们可以一次完成这项工作

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

如果这不起作用(这台计算机上没有Fortran语言,所以我没有检查过),就摆弄
spread
,直到它起作用为止。实际上,您可能需要将
3
替换为
size(x,1)
或类似的值


我希望这将导致编译器创建临时数组。我预计,很容易发现它的表现不如问题中明确的循环方案整洁的“一行程序”通常在时间和空间上都有成本。而且经常尝试和信任的Fortran显式循环方法是一种可以使用的方法。

为什么要用垃圾代码取代清晰易读的代码

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

那么,它会创建中间数组吗?如果我使用大型阵列,那么它会牺牲计算时间和内存吗?
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