2015-11-05 39 views
2

我从来没有写过Fortran,但我正在尝试将脚本改编为R,以下几行让我感到困惑。因此,这是变量是如何定义的:矩阵上的函数是否应用于整个矩阵或Fortran中的每一行?

real, dimension(n,nd) :: x

这是否意味着xn阵列充满ndreal值或n X nd矩阵?

然后

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

被应用。变量amax是在x中绝对值的全局最大值,还是最大值为n的数组,每行一个?这对了解x = x/amax是应用于每行还是整个矩阵很重要。这个功能的目的似乎是某种标准化。

回答

3

标题的问题比身体的问题要普遍得多,所以我稍后会谈谈。

maxval(array)的结果是标量,是array中的最大值(如果它的大小非零)。

在你的例子中,x是一个等级2的单个数组(通常被认为是一个矩阵)。因此,maxval(x)的确是你称之为矩阵的全局最大值。需要maxval的替代形式来逐行提供最大值:maxval(x,dim=2)

现在,还有别的东西从你的例子来说明:

x = x/amax 

有关于xamax形状要求。

你不给amax声明,但有两种可能:

  • amax具有相同的形状x;或
  • amax是一个标量。

[注意amax不必是标量,只是因为它是从maxval参考分配一个标量的结果。但是,你会看到,amax不会被宣布为1级,使用尺寸x行数,所以这是另一条线索是maxval正在给全球最大]

这两种可能性都来自一致性规则进行划分。用amax标量x的每个元素除以该值;与amax阵列的每个元素xamax中的相应元素分开。

如果你想标准化每个单独的行x那么你就不能使用该分割表达式与amax秩1数组。

来到更具普遍性的问题:即使它是一个非此即彼/或问题的答案是“不”。没有单一的方式。每个功能按照其定义的方式工作。

作为一般规则,虽然,Fortran语言的内在功能很少关心其中有“行”阵列的具体情况。但有一个有用的想法是,一个函数可以:

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

由许多人将此dim参数调节,导致函数作用于片而不是。

+1

的Fortran甚至有一个用于该上数组元素单独地操作这些内部函数,它们被称为'elemental'名称。在用户定义的函数中可以使用关键字'elemental'来告诉编译器它们可以安全地应用于数组。 “最大”不是那些基本功能之一。 –

1

第一行意味着该变量x是两个维度(n,nd)和不ndn数组的数组。函数maxval返回此数组中的最大值。

请参阅F90_notes.pdf中的第130页(在PDF中不是打印的数字)(您还可以在同一文档中找到有关数组的全部章节)。

0

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

相关问题