在 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 functionsdo concurrentforallwhere 构造、隐式循环和数组构造函数。在这里重复它们没有意义,它们已在本网站或教程中多次描述。

您的示例最简单地使用循环完成

  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。这些操作不一定有效。例如,最后一次调用可能需要创建一个临时数组,这在使用循环时可以避免。