Fortran findloc内部

Fortran findloc内部,fortran,Fortran,我使用的是英特尔的Visual Fortran Composer XE 2011,12.1.3537.2010,看起来,不支持内置的findloc函数(在2008年Fortran中型外伸版中添加) 我要做的是在数组中查找特定值并返回索引。我主要使用小尺寸阵列 我有两个问题: 我想用这个功能取代线性和二进制搜索,正如我在其他线程中读到的,不清楚哪种算法更适合获得最佳性能。内在函数如何处理这个问题 由于我的编译器不支持这一点,因此模拟findloc的方法如下: minloc( (array-valu

我使用的是英特尔的Visual Fortran Composer XE 2011,12.1.3537.2010,看起来,不支持内置的
findloc
函数(在2008年Fortran中型外伸版中添加)

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

我有两个问题:

  • 我想用这个功能取代线性和二进制搜索,正如我在其他线程中读到的,不清楚哪种算法更适合获得最佳性能。内在函数如何处理这个问题
  • 由于我的编译器不支持这一点,因此模拟
    findloc
    的方法如下:

    minloc( (array-value)**2 )
    
    但是。。。演出怎么样?还有其他想法吗


  • 如果您关心性能,在任何情况下都可以编写自己的,可能是多线程版本。
    minloc
    解决方案是众所周知的,在
    comp.lang.fortran
    上已经讨论过多次,但是如果您想要性能,它确实对您不利。也可能存在舍入或溢出问题


    如果你有一个通用数组,你必须线性地遍历它,如果它被排序并且很大,你可以使用二进制搜索(但是注意,它通常在每次比较中有更大的开销)。

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

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

    如果您的数组很小且未排序,我希望线性搜索是最快的选择。如果它们很小并且经过排序,那么您可以编写一个二进制搜索(或类似的搜索),以超越线性搜索。我希望这两种方法的性能图都有一个交叉点,交叉点的位置与你的小尺寸概念不符,我一点都不知道


    但是,与性能问题一样,我(或其他任何人)认为没有用的东西,数据就是你所需要的,你为什么不继续做一些测量呢?

    谢谢。你确实正确地理解了我的第一个问题。关于第二个数组,我的数组大小很小(其中small=通常是元素的十分之几,很少是元素的百分之几),并且经过排序。我想在了解了预期情况后再进行测量。但我想,这很难说,因为这是一个相当依赖于编译器的问题。当我得到一些值得分享的东西时,我会尽快告诉你。