在 Fortran 中有效地构建结构化矩阵
construct a structured matrix efficiently in fortran
离开 Fortran 好几年了,现在我不得不重新开始使用它。
我想用 entry(i,j)
构造一个 f(x_i,y_j)
形式的矩阵,其中 f
是两个变量的函数,例如 f(x,y)=cos(x-y)
。在 Matlab 或 Python(Numpy) 中,有 高效 方法来处理此类特定问题。不知Fortran中有没有这样的优化。
顺便说一句,在 Fortran 中,矢量化操作是否也比 do/for 循环更快(就像在 Matlab 和 Numpy 中的情况一样)?
如果你的意思是矢量化与你在 Matlab 和 Python 中的意思相同,那么你在整个数组上调用的短形式则不,这些形式通常更慢,因为它们可能比简单的更难优化循环。更快的是当编译器实际使用 CPU 的矢量指令时,但那是另外一回事。编译器更容易将它们用于简单循环。
Fortran 具有 elemental functions
、do concurrent
、forall
和 where
构造、隐式循环和数组构造函数。在这里重复它们没有意义,它们已在本网站或教程中多次描述。
您的示例最简单地使用循环完成
do j = 1, ny
do i = 1, nx
entry(i,j) = f(x(i), y(j))
end do
end do
您可能指的是类似 Python 的矢量化,其中一个简短的方法是整个数组操作,例如
A = cos(B)
C = A * B
D = f(A*B)
和类似的。该函数(对数组的每个元素调用)必须是 elemental
。这些操作不一定有效。例如,最后一次调用可能需要创建一个临时数组,这在使用循环时可以避免。
离开 Fortran 好几年了,现在我不得不重新开始使用它。
我想用 entry(i,j)
构造一个 f(x_i,y_j)
形式的矩阵,其中 f
是两个变量的函数,例如 f(x,y)=cos(x-y)
。在 Matlab 或 Python(Numpy) 中,有 高效 方法来处理此类特定问题。不知Fortran中有没有这样的优化。
顺便说一句,在 Fortran 中,矢量化操作是否也比 do/for 循环更快(就像在 Matlab 和 Numpy 中的情况一样)?
如果你的意思是矢量化与你在 Matlab 和 Python 中的意思相同,那么你在整个数组上调用的短形式则不,这些形式通常更慢,因为它们可能比简单的更难优化循环。更快的是当编译器实际使用 CPU 的矢量指令时,但那是另外一回事。编译器更容易将它们用于简单循环。
Fortran 具有 elemental functions
、do concurrent
、forall
和 where
构造、隐式循环和数组构造函数。在这里重复它们没有意义,它们已在本网站或教程中多次描述。
您的示例最简单地使用循环完成
do j = 1, ny
do i = 1, nx
entry(i,j) = f(x(i), y(j))
end do
end do
您可能指的是类似 Python 的矢量化,其中一个简短的方法是整个数组操作,例如
A = cos(B)
C = A * B
D = f(A*B)
和类似的。该函数(对数组的每个元素调用)必须是 elemental
。这些操作不一定有效。例如,最后一次调用可能需要创建一个临时数组,这在使用循环时可以避免。