Fortran findloc内在

时间:2013-02-18 11:52:09

标签: fortran

我正在使用英特尔的Visual Fortran Composer XE 2011,12.1.3537.2010,并且看起来不支持内部findloc功能(在2008 fortran中型扩展中添加)。

我想要做的是在数组中查找特定值并返回索引。我主要使用小尺寸阵列。

我有两个问题:

  1. 我想用这个功能替换线性和二进制搜索,正如我在其他线程中读到的那样,不清楚哪种算法是最佳性能的首选。内在函数如何处理问题?
  2. 由于我的编译器不支持,因此模拟findloc的方法如下:

    minloc( (array-value)**2 )
    

    但是......表现怎么样?还有其他想法吗?

2 个答案:

答案 0 :(得分:4)

如果我理解你的第一个问题,你想知道一个尚未实现的功能是如何实现的?具体来说,您想知道findloc与线性和二进制搜索相比的性能特征,因为您可能已经自己实现了它们?当然,语言标准中没有任何内容要求如何实现该功能,因此您的问题的答案完全取决于编译器。

至于你的第二个问题,我希望大多数编译器能够创建一个临时数组来响应你的表达式array-value。创建这样的临时操作可能是一个相对耗时的操作,并且会被添加到对minloc的调用的执行时间中。英特尔minloc的实现如何工作我不知道,但我希望它是通过阵列的线性扫描。内部函数无法知道数组是否已排序且二进制搜索可能更快。

如果您的阵列很小且未分类,我希望线性搜索是最快的选择。如果它们很小并且已经排序,您可以编写二进制搜索(或类似)以超越线性搜索。我希望这两种方法的性能图有一个交叉,其中交叉符合小尺寸的想法我没有线索。

然而,与性能问题一样,我(或任何其他人)认为无用,数据是您需要的,为什么不继续进行测量呢?

答案 1 :(得分:0)

如果您关注性能,请在任何情况下编写自己的,可能是多线程版本。 minloc解决方法众所周知,已在comp.lang.fortran上多次讨论,但如果您想要性能,那对您来说真的不好。圆角或溢出也可能存在问题。

如果你有一个通用数组,你必须线性通过它,如果它是有序的和大的,你可以使用二进制搜索(但请注意,它通常每次比较的开销更大)。