离开Fortran已经好几年了,现在我必须把它拿起并再次开始使用它。
我想在entry(i,j)
格式中构建一个f(x_i,y_j)
的矩阵,其中f
是两个变量的函数,例如f(x,y)=cos(x-y)
。在Matlab或Python(Numpy)中,有有效的方法来处理这种特定问题。我想知道Fortran中是否有这样的优化。
答案 0 :(得分:0)
如果你的意思是矢量化与你在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
。这些操作不一定有效。例如,最后一次调用可能需要创建一个临时数组,这在使用循环时可以避免。