gpt4 book ai didi

arrays - Fortran:哪种方法可以更快地更改数组的等级? ( reshape 与指针)

转载 作者:行者123 更新时间:2023-12-04 12:50:17 25 4
gpt4 key购买 nike

当我们处理大型数组时,特别是当它在多个子程序/函数中发生几次时,考虑数组的秩和形状变化的成本可能很重要。

我的问题的主要目的是将数组的排名从第 2 位更改为第 1 位,反之亦然...

要做到这一点,可以使用:

  • RESHAPE 声明
  • 指针变量。下面的代码展示了如何使用指针变量:
    program test
    real, pointer :: a(:)
    real, pointer :: b(:,:)

    allocate(a(6))
    a = (/1,2,3,4,5,6/)
    b (1:2, 1:3) => a

    WRITE(*,*) 'b=',b(3,1)
    end program test

  • 问题 :
    1. 哪种方法更快?
    2. 有没有其他更快的方法?
    3. 做这项工作还有什么其他建议吗?

    谢谢...

    最佳答案

    好吧,Fortran 被设计为 MATH 语言。我挖了一点,我在 Fortran 中遇到了以下几点。

    在解释要点之前的一些解释:

    我的子程序必须使用 1st rank 数组。我在子例程的开头调用 2nd rank 数组作为输入。然后,我需要将排名从第 2 位更改为第 1 位。稍后在子程序中,我需要将等级更改回 2。这种等级更改在代码中发生了 3-4 次。

  • 使用 等效 声明:

  • 这是最快的方法。内存中没有任何变化,我认为这是最好的。但是,它以我的问题的属性冲突错误结束,因为我在子例程中工作。
  • 使用 指针属性:

  • 我试过 指针然后。但是,似乎不可能将 2nd rank 数组重新映射到 1st rank 数组。将 1st rank 重新映射到 2nd rank 数组工作正常。

    我编写的简单代码是将 1 级数组重新映射为 2 级数组:
    program ptrtest
    real, pointer :: a(:)
    real, pointer :: b(:,:)

    allocate(b(1:2,1:3))
    b = transpose(reshape((/ 1, 2, 3, 4, 5, 6 /), shape(b)))
    a(1:6) => b(:,:)

    WRITE(*,*) a(4), b(2,2) ! to see if the remapped elements are same?
    end program ptrtest

    我收到的错误:
    gfortran -Wall -o "POINTER" "POINTER.f90" (in directory: /home/vahid/Desktop)
    POINTER.f90:12.14:
    a(1:6) => b(:,:)
    1
    Error: Rank remapping target must be rank 1 or simply contiguous at (1)
    Compilation failed.
  • RESHAPE 声明:

  • 能够进行任何类型转换的最慢方法。基本上,考虑到内存效率和处理成本,它为转换后的元素分配另一个内存位置,这是昂贵的。

    因此,Fortran 2003 手册指出:(第 2.2.4 和 5.2 节)

    数据对象的大小、形状、类型或长度类型参数可能是动态的,但等级或种类类型参数不是。

    我不知道后果,但我认为数组的排名也应该是动态的。如果有任何部分错误,请更正。

    关于arrays - Fortran:哪种方法可以更快地更改数组的等级? ( reshape 与指针),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31169856/

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