Fortran 中的矩阵函数是应用于整个矩阵还是应用于每一行?

Are functions on matrices applied to the entire matrix or each row in Fortran?

我从未用 Fortran 编写过,但我正在尝试将脚本改编为 R,但以下几行让我感到困惑。所以这就是变量的定义方式:

real, dimension(n,nd) :: x

这是否意味着 xn 数组,其中填充了 ndreal 值或 n x nd 矩阵?

然后

amax = maxval(abs(x))
x = x/amax

已应用。变量 amaxx 中绝对值的全局最大值还是 n 最大值的数组,每行一个?了解 x = x/amax 是应用于每一行还是整个矩阵很重要。这个函数的目的似乎是某种类型的规范化。

第一行表示变量 x 是二维数组 (n,nd) 而不是 n 数组的 nd 值。函数 maxval returns 这个数组中的最大值。

请参阅 F90_notes.pdf 中的第 130 页(在 PDF 中,而不是打印的数字)(您还会在同一文档中找到有关数组的整章)。

添加到 Baruchel 的答案中:x/amax 将二维数组的每个元素 x 除以标量 amax

标题的问题比body的问题笼统得多,所以我稍后再说。

maxval(array) 的结果是一个标量,是 array 中的最大值(如果它的大小为 non-zero)。

在您的示例中,x 是秩为 2 的单个数组(通常被认为是矩阵)。因此,maxval(x) 确实是您所说的该矩阵的全局最大值。需要 maxval 的另一种形式来给出 row-by-row 最大值:maxval(x,dim=2).

现在,您的示例中还有一些要注意的地方:

x = x/amax

xamax的形状有要求。

您没有为 amax 提供声明,但有两种可能性:

  • amaxx形状相同;或
  • amax 是一个标量。

[请注意,amax 不必是标量,因为它从 maxval 引用中分配了一个标量结果。但是,您会看到 amax 不会被声明为 rank 1,大小为 x 的行数,因此这是 maxval 给出全局最大值的另一个线索。]

这两种可能性来自一致性划分规则。对于 amax 标量,x 的每个元素都除以该值;对于 amax 数组,x 的每个元素除以 amax.

中的对应元素

如果您想规范化 x 的每一行,那么您就不能将除法表达式与 amax 秩为 1 的数组一起使用。

来到更笼统的问题:尽管这是一个 either/or 问题,但答案是 "no"。没有单一的方法。每个函数都按其定义的方式运行。

不过,作为一般规则,Fortran 的内部函数很少关心具有 "rows" 的数组的具体情况。但是一个有用的想法是函数可以执行以下任一操作:

  • 单独对所有元素,返回相同形状的数组;
  • 在整个数组上,返回一个标量。

由于许多人会有这个 dim 参数导致函数改为作用于切片这一事实而受到调解。