And*_*ida 0 arrays algorithm fortran
我试图检查整数A的一维数组是否包含,在它的每一个大小(A)位置,整数集合S(也是一维数组)的任何元素,一般情况是尺寸(S)> 1.
简单明了的方法是执行以下嵌套循环:
DO i = 1, size(A)
DO j = 1, size(S)
IF(A(i) == S(j)) ** do something **
ENDDO
ENDDO
Run Code Online (Sandbox Code Playgroud)
问题是,对于大型阵列A和S,此过程效率非常低.是否有一个内在的FORTRAN子例程或函数可以更快地执行此操作?还是其他方法?
我试图做以下,但它不想编译:
DO i = 1, NNODES
IF(A(i) == ANY(S)) ** do something **
ENDDO
Run Code Online (Sandbox Code Playgroud)
出现的错误消息如下:" error #6362: The data types of the argument(s) are invalid."我正在使用VS2010和Intel Parallel Studio 2013.
表达方式
A(i) == ANY(S)
Run Code Online (Sandbox Code Playgroud)
lhs上有一个整数,rhs上有一个逻辑.对于那些在Fortran中作为可比类型的人来说,我们没有那种C风格的废话,非常感谢你.实际上,它比这更糟糕,any返回逻辑但在输入上采用一组逻辑,因此any(array_of_int)不会编译.
你可以试试
ANY(S==A(i))
Run Code Online (Sandbox Code Playgroud)
代替.这应该给你一个可编译的解决方案.
现在,至于效率,你是第一个片段O(n^2).你可以渐渐地做得更好.对两个数组进行排序并将它们串联扫描,这O(n + n log n)或类似的东西.如果您需要帮助编写代码,请更新您的问题,但我怀疑它已经在SO上被询问和回答.
我强烈怀疑,你可以检查你是否关心,any在单个(显式)循环中使用也是O(n^2)- 因为any必须在最常见的情况下操作我看不到扫描阵列的任何现实替代方案 - - 换句话说,另一个循环.