矩阵和向量的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