Fortran 中的矩阵函数是应用于整个矩阵还是应用于每一行?
Are functions on matrices applied to the entire matrix or each row in Fortran?
我从未用 Fortran 编写过,但我正在尝试将脚本改编为 R,但以下几行让我感到困惑。所以这就是变量的定义方式:
real, dimension(n,nd) :: x
这是否意味着 x
是 n
数组,其中填充了 nd
个 real
值或 n
x nd
矩阵?
然后
amax = maxval(abs(x))
x = x/amax
已应用。变量 amax
是 x
中绝对值的全局最大值还是 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
对x
和amax
的形状有要求。
您没有为 amax
提供声明,但有两种可能性:
amax
与x
形状相同;或
amax
是一个标量。
[请注意,amax
不必是标量,因为它从 maxval
引用中分配了一个标量结果。但是,您会看到 amax
不会被声明为 rank 1,大小为 x
的行数,因此这是 maxval
给出全局最大值的另一个线索。]
这两种可能性来自一致性划分规则。对于 amax
标量,x
的每个元素都除以该值;对于 amax
数组,x
的每个元素除以 amax
.
中的对应元素
如果您想规范化 x
的每一行,那么您就不能将除法表达式与 amax
秩为 1 的数组一起使用。
来到更笼统的问题:尽管这是一个 either/or 问题,但答案是 "no"。没有单一的方法。每个函数都按其定义的方式运行。
不过,作为一般规则,Fortran 的内部函数很少关心具有 "rows" 的数组的具体情况。但是一个有用的想法是函数可以执行以下任一操作:
- 单独对所有元素,返回相同形状的数组;
- 在整个数组上,返回一个标量。
由于许多人会有这个 dim
参数导致函数改为作用于切片这一事实而受到调解。
我从未用 Fortran 编写过,但我正在尝试将脚本改编为 R,但以下几行让我感到困惑。所以这就是变量的定义方式:
real, dimension(n,nd) :: x
这是否意味着 x
是 n
数组,其中填充了 nd
个 real
值或 n
x nd
矩阵?
然后
amax = maxval(abs(x))
x = x/amax
已应用。变量 amax
是 x
中绝对值的全局最大值还是 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
对x
和amax
的形状有要求。
您没有为 amax
提供声明,但有两种可能性:
amax
与x
形状相同;或amax
是一个标量。
[请注意,amax
不必是标量,因为它从 maxval
引用中分配了一个标量结果。但是,您会看到 amax
不会被声明为 rank 1,大小为 x
的行数,因此这是 maxval
给出全局最大值的另一个线索。]
这两种可能性来自一致性划分规则。对于 amax
标量,x
的每个元素都除以该值;对于 amax
数组,x
的每个元素除以 amax
.
如果您想规范化 x
的每一行,那么您就不能将除法表达式与 amax
秩为 1 的数组一起使用。
来到更笼统的问题:尽管这是一个 either/or 问题,但答案是 "no"。没有单一的方法。每个函数都按其定义的方式运行。
不过,作为一般规则,Fortran 的内部函数很少关心具有 "rows" 的数组的具体情况。但是一个有用的想法是函数可以执行以下任一操作:
- 单独对所有元素,返回相同形状的数组;
- 在整个数组上,返回一个标量。
由于许多人会有这个 dim
参数导致函数改为作用于切片这一事实而受到调解。