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

2024-02-24

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

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

为此,可以使用:

  1. 重塑声明
  2. 指针变量。下面的代码展示了如何使用指针变量:

    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 被设计为数学语言。我进行了一些挖掘,发现了 Fortran 中的以下几点。

在解释要点之前先做一些解释:

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

  1. USING 等价陈述:

这是最快的方法。记忆中没有任何改变,我认为这是最好的。但是,它以我的问题的属性冲突错误结束,因为我正在子例程内工作。

  1. Using Pointer属性 :

我努力了pointer然后。但是,似乎不可能将第二级数组重新映射到第一级数组。将第一级数组重新映射到第二级数组效果很好。

我编写的简单代码是将第一级数组重新映射到第二级数组:

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.
  1. RESHAPE陈述:

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

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

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

我不知道后果,但我认为数组的等级也应该是动态的。如有部分错误请指正。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Fortran:哪种方法可以更快地更改数组的等级? (重塑与指针) 的相关文章

  • const 和 constexpr 数组之间的区别

    为什么有区别const and constexpr当与数组一起使用时 int const xs 1 2 3 constexpr int ys 1 2 3 int as xs 0 error int bs ys 0 fine 我希望两者都能x
  • 如何在Delphi中将对象方法作为参数传递,然后调用它?

    我担心这可能是一个有点愚蠢的问题 但这让我很难过 我正在寻找将对象的方法传递到过程中的最简单的方法 以便过程可以调用对象的方法 例如 超时后 或者可能在不同的线程中 所以基本上我想 捕获对对象方法的引用 将该引用传递给过程 使用该引用 从过
  • 使用字符串中的变量名称访问变量值,R

    Intro 一个数据集有大量的age year变量 age 1990 age 1991 etc 我有一个字符串值数组length age years 表示这些变量 使得age years 1 回报 age 1990 etc Need 我想搜
  • 如何从嵌套的对象数组中获取每个父级的值

    所以我有多个对象数组 每个对象都包含一个子对象 e g const data id 1 name parent 1 children id c1 name child 1 children id g1 name grand 1 childr
  • 修改C中的const char *

    我正在练习面试 我目前遇到的问题是反转 C 中的常量字符串 我知道由于 str2 是 const 所以我可以修改 str2 指向的位置 但不能修改它的值 我下面有一个名为reverse const 的函数 它会将 const char st
  • C++:向 std::sort 提供模板化比较函数

    假设我想让 std sort 根据指针指向的 int 值对指向 int 的指针向量进行排序 忽略那里明显的性能问题 很简单吧 做一个函数 bool sort helper const int a const int b return a l
  • Excel:#CALC!使用 MAP 函数计算间隔重叠时出现错误(嵌套数组)

    我正在努力解决以下公式 它适用于某些情况 但不适用于所有情况 名字input有失败的数据集 得到一个 CALC 描述 嵌套数组 错误 LET input N1 0 0 N1 0 10 N1 10 20 names INDEX input 1
  • x86 上未对齐的指针

    有人可以提供一个示例 将指针从一种类型转换为另一种类型由于未对齐而失败吗 在评论中这个答案 https stackoverflow com questions 544928 reading integer size bytes from a
  • 使用随机放置的 NaN 创建示例 numpy 数组

    出于测试目的 我想创建一个M by Nnumpy 数组与c随机放置的 NaN import numpy as np M 10 N 5 c 15 A np random randn M N A mask np nan 我在创建时遇到问题mas
  • C++从文件中读取整数并保存到数组中

    我正在制作一个仅从文本文件读取整数的程序 我想创建一个读取整数并将它们存储在数组中的函数 以便稍后可以使用该数组通过冒泡排序对它们进行排序 这是我到目前为止所得到的 但我得到的输出是一些随机的 803234 数字 void read int
  • 使用 UISearchBar 过滤数组

    我目前正在使用以下代码来过滤数组并将结果显示在我的 tableView 中 问题是 只有当搜索与确切的单词匹配时 才会返回结果 如何更改数组过滤器以在输入时搜索每个字符 let data Mango Grape Berry Orange A
  • 使用 Java 进行 MongoDB 查询。计算数组中的匹配项

    我在 Mongo 中存储了类似于以下内容的数据 LIST NAME a VALUE z NAME b VALUE y NAME c VALUE x NAME d VALUE w NAME e VALUE v NAME f VALUE u N
  • 如何将我的 json 字符串 avro 二进制编码为字节数组?

    我有一个实际的 JSON 字符串 我需要将其 avro 二进制编码为字节数组 在经历了Apache Avro 规范 http avro apache org docs 1 7 7 spec html 我想出了下面的代码 我不确定这是否是正确
  • 删除二维数组C++[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 这两种释放二维数组的方法是否相似 int M new int 5 for int i 0 i lt 5 i M i new int 3 fo
  • 将数组作为参数传递

    如果我们修改作为方法内参数传递的数组的内容 则修改是在参数的副本而不是原始参数上完成的 因此结果不可见 当我们调用具有引用类型参数的方法时 会发生什么过程 这是我想问的代码示例 using System namespace Value Re
  • PHP条件,如果当前页面,则链接突出显示[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我有一个带
  • TypeScript 枚举到对象数组

    我有一个这样定义的枚举 export enum GoalProgressMeasurements Percentage 1 Numeric Target 2 Completed Tasks 3 Average Milestone Progr
  • 在 Go 中,如何将结构体转换为字节数组?

    我有一个我定义的结构实例 我想将其转换为字节数组 我尝试了 byte my struct 但这不起作用 另外 我还被指出二进制包 http golang org pkg encoding binary 但我不确定我应该使用哪个函数以及应该如
  • 如何将 UDF 中的结构或类数组返回到数据帧列值中?

    d ID 1 pID 1000 startTime 2018 07 02T03 34 20 endTime 2018 07 03T02 40 20 ID 1 pID 1000 startTime 2018 07 02T03 45 20 en
  • strcmp 给出分段错误[重复]

    这个问题在这里已经有答案了 这是我的代码给出分段错误 include

随机推荐