Performance 用fortran高效构造结构化矩阵

Performance 用fortran高效构造结构化矩阵,performance,matrix,fortran,fortran90,Performance,Matrix,Fortran,Fortran90,离开Fortran已经好几年了,现在我必须拿起它,重新开始使用它 我想用entryi,j构造一个矩阵,形式为fx_I,y_j,其中f是两个变量的函数,例如fx,y=cosx-y。在Matlab或pythonumpy中,有一些有效的方法来处理此类特定问题。我想知道Fortran中是否有这样的优化 顺便说一句,在Fortran中,向量化操作比do/for循环更快,就像在Matlab和Numpy中一样吗?如果你所说的向量化与你在Matlab和Python中的意思相同,你在整个数组中调用的缩写形式,那么

离开Fortran已经好几年了,现在我必须拿起它,重新开始使用它

我想用entryi,j构造一个矩阵,形式为fx_I,y_j,其中f是两个变量的函数,例如fx,y=cosx-y。在Matlab或pythonumpy中,有一些有效的方法来处理此类特定问题。我想知道Fortran中是否有这样的优化


顺便说一句,在Fortran中,向量化操作比do/for循环更快,就像在Matlab和Numpy中一样吗?

如果你所说的向量化与你在Matlab和Python中的意思相同,你在整个数组中调用的缩写形式,那么不,这些形式通常较慢,因为它们比简单循环更难优化。更快的是编译器实际使用CPU的向量指令,但这是另一回事。编译器更容易将它们用于简单循环

Fortran具有基本函数、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)

类似的。对数组的每个元素调用的函数必须是元素。这些操作不一定有效。例如,最后一次调用可能需要创建一个临时数组,这在使用循环时是可以避免的。

谢谢。你提到的每一个学期我都很熟悉,那时我在大学时代比你小三四岁。现在有点令人失望,我不得不再次从零开始。