gpt4 book ai didi

c - MINLOC 是否适用于从索引 0 开始的数组? (Fortran 90/95)

转载 作者:太空狗 更新时间:2023-10-29 15:48:41 25 4
gpt4 key购买 nike

使用 C 一段时间后,我回到 Fortran 并将我代码中的数组从索引 0 分配到 N:

real(kind=dp), dimension(:), allocatable :: a 
allocate(a(0:50))

我需要找到数组的最小绝对值的索引,所以我使用了 MINLOC,为了检查这一点,我将它与 MINVAL 进行了比较:

minloc(abs(a(:)))
minval(abs(a))

MINLOC 的结果是索引 42,但 MINVAL 的结果对应于 41。这是输出中的相关部分:

Index i    a(i) 

39 0.04667
40 0.02222
41 0.00222 !This was clearly the minimum value
42 0.02667

MINLOC = 42
MINVAL = 0.00222

我认为这与 Fortran 内在函数没有正确处理索引为 0 的数组有关,因为以这种方式声明数组不是标准的 Fortran 风格(但仍然允许!)。

谁能证实这一点或提供解决方法?

最佳答案

您的数组 a 确实从索引 0 开始,但您没有使用它。您至少搜索了数组 abs(a(:))。这个匿名数组表达式从 1 开始,默认情况下所有数组都是如此。

但即使您使用 a,结果也会相同,并且与 Fortran 中数组参数传递的工作方式一致。

Fortran 标准明确指出:

The i subscript returned lies in the range 1 to ei , where ei is the extent of the idimension of ARRAY. If ARRAY has size zero, all elements of the result are zero.

如果您使用假定的形状参数,则下限不会自动随数组传递。例如,如果您有自己的功能

  function f(arg)
real :: arg(:)

arg 始终从 1 开始,无论实际参数在调用代码中的何处开始。

您可以将其更改为以其他值开始

  function f(arg)
real :: arg(-42:)

它将从该值开始编制索引。

关于c - MINLOC 是否适用于从索引 0 开始的数组? (Fortran 90/95),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29583480/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com