MINLOC可以返回多个最小值的阵列吗?

时间:2018-04-20 17:43:52

标签: fortran

我发现了关于export class App extends Component { componentDidMount() { this.props.loadAppAction(); } ... } MINVAL的讨论:

Finding [index of] the minimal value in array which satisfies a condition in Fortran

我想知道MINLOCMINLOC是否能够在有多个最小值/最大值的情况下返回一个数组。

另外,一旦我获得索引数组,我如何在这些索引上循环最好?

3 个答案:

答案 0 :(得分:2)

他们可能不会。对于minloc,结果描述为(F2008,13.7.114):

  

如果只有一个元素具有最小值,则返回该元素的下标。否则,如果多个元素具有最小值且BACK不存在或者值为false,则返回其下标的元素是第一个以数组元素顺序获取的元素。如果BACK的值为true,则返回其下标的元素是最后一个以元素顺序排列的元素。

maxloc类似。

当然,它们确实有数组结果,但是rank-1数组的元素给出了单个元素的索引。较高等级的数组不会反映更多返回的元素,而是沿着维度减少(使用dim=说明符)。

也就是说,如果你在知道极值的值时寻找全局极值(在公差范围内)的多个匹配,这只是在整个数组中寻找相等的值(在容差范围内)。寻找局部极值是一个非常不同但有趣的问题。

即使在第一种情况下,也有更好的算法不能使用minlocmaxloc

答案 1 :(得分:1)

对一些问题的答案,特别是这一点

  

此外,一旦我获得了索引数组,我如何最好地循环   这些指数?

通常你不需要索引数组,你只需要记住Fortran(现在)是一种数组编程语言并且你写了

where(myarray==minval(myarray)) myarray = fun(myarray)

如果这还不够,您还可以使用where构造,该构造可以包含任意数量的elsewhere子句。显然,如果你想要一个宽容的等式,你可以根据需要调整掩码表达式。

如果您要重复使用where(myarray==minval(myarray))并且关注重复评估掩码表达式,您只需预先计算它,例如

mymask = myarray==minval(myarray)

然后一次又一次地使用它

where (mymask) ...

答案 2 :(得分:1)

确定。我想与@francescalus选项一起去

  • 首先找到极值,然后,一旦知道,
  • 在矩阵上循环寻找相等的值(首先不使用@HighPerformanceMark下面建议的“where”)

我的代码目前看起来像这样:

DO k=k1,k2
   DO j=j1,j1
      DO ii=i1,i2

         DO iSpec =1,nSpec
            density_spec(iSpec, ii, j, k) = Q(1, ii, j, k)
            min_dens(iSpec) = MINVAL(density_spec) 
         ENDDO

      ENDDO
   ENDDO
ENDDO

DO iSpec=1,nSpec

   DO k=k1,k2
      DO j=j1,j2
         DO ii=i1,i2

             IF( density_spec(iSpec, ii, j, k)==min_dens(iSpec)) THEN
                chem_time1(iSpec) = MIN(chem_time1(iSpec), density_spec(iSpec, ii, j, k)/(omgdot_spec(iSpec, ii, j, k)+1.E-16))
             ENDIF

         ENDDO
      ENDDO
   ENDDO

ENDDO

目前,我在“min_dens()= MINVAL()”行收到“浮动无效”。你知道为什么吗?此外,不确定如何添加公差。