可变大小数组的 Fortran 数组 [关闭]

2024-01-10

问题的简化描述:

正好有maxSize人们在商店购物。他们每个人都有一个购物清单,其中包含商品的价格(作为整数)。使用 Fortran 数组,我如何表示所有购物清单。购物清单可能包含any项目数量(1、10、1000000000)。

(注意:实际问题要复杂得多。它甚至与购物无关。)

懒惰的方法是:

integer :: array(maxSize, A_REALLY_BIG_NUMBER)

然而,这是非常浪费的,我基本上希望第二个维度是可变的,然后单独分配给每个人。

明显的尝试注定会失败:

integer, allocatable :: array(:,:)
allocate(array(maxSize, :)) ! Compiler error

Fortran 似乎要求数组的每个维度都有固定的大小。

这很奇怪,因为大多数语言将多维数组视为“数组的数组”,因此您可以单独设置“数组的数组”中每个数组的大小。

这是一些东西does work:

type array1D
    integer, allocatable :: elements(:) ! The compiler is fine with this!
endtype array1D

type(array1D) :: array2D(10)
integer :: i

do i=1, size(array2D)
    allocate(array2D(i)%elements(sizeAt(i))
enddo

如果这是唯一的解决方案,我想我会使用它。但我有点希望有一种方法可以使用内在函数来做到这一点。必须为如此简单的事情定义自定义类型有点烦人。

在 C 中,由于数组基本上是一个具有奇特语法的指针,因此您可以使用指针数组来完成此操作:

int sizeAt(int x); //Function that gets the size in the 2nd dimension
int * array[maxSize];

for (int x = 0; x < maxSize; ++x)
        array[x] = (int*)(calloc(sizeAt(x) , sizeof(int)));

Fortran 似乎也有指针。但我发现的唯一教程都说“永远不要使用这些”或类似的内容。


你似乎在抱怨 Fortran 不是 C。确实如此。标准委员会选择不同做法的原因可能有无数种,但以下是一些想法:

Fortran 数组的强大功能之一是它们可以切片。

a(:,:,3) = b(:,:,3)

是一个完全有效的陈述。如果数组是“指向数组的指针的数组”,则无法实现此目的因为沿每个轴的尺寸不一定是一致的(您正在尝试实现的情况)。

在 C 语言中,确实不存在多维数组这样的东西。您可以使用指向数组的指针数组来实现看起来类似的东西,但这并不是真正的多维数组,因为它不共享公共内存块。这可能会对性能产生影响。事实上,在 HPC(许多 Fortran 用户花费时间的地方)中,多维 C 数组通常是包装在宏中的一维数组,用于根据维度的大小计算步幅。另外,取消引用 7D 数组,如下所示:

a[i][j][k][l][m][n][o]

比以下内容更难输入:

a(i,j,k,l,m,n,o)

最后,您发布的解决方案最接近您尝试模拟的 C 代码 - 它有什么问题?请注意,对于您的问题陈述,可能需要更复杂的数据结构(如链接列表)(可以用 C 或 Fortran 实现)。当然,就性能而言,链表是最差的,但如果这不是问题,那么它可能是正确的数据结构,因为“购物者”可以决定将更多东西添加到他们的“购物车”中,即使它不在他们带到商店的购物清单上。

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

可变大小数组的 Fortran 数组 [关闭] 的相关文章

  • 无循环按键对多维数组求和

    我有这个 Array 0 gt Array f count gt 1 uid gt 105 1 gt Array f count gt 0 uid gt 106 2 gt Array f count gt 2 uid gt 107 3 gt
  • PHP 中两个关联多维数组的值求和

    我正在尝试对两个关联数组的值求和 这是第一个数组 Array Jan 01 2013 gt Array COM gt 100 RES gt 200 Oct 28 2014 gt Array COM gt 300 RES gt 400 这是第
  • numpy:高效执行数组的复杂重塑

    我正在将供应商提供的大型二进制数组读入 2D numpy 数组 tempfid M N load data data numpy fromfile file dirname fid dtype numpy dtype i4 convert
  • PHP 和 NLP:嵌套括号(解析器输出)到数组?

    想要将带有嵌套括号的文本转换为嵌套数组 以下是 NLP 解析器的输出示例 TOP S NP PRP I VP VBP love NP NP DT a JJ big NN bed PP IN of NP NNS roses 原文 我喜欢一大床
  • Lua C API:初始化结构体 C 中的变量矩阵

    我正在尝试使用 Lua C API 创建一个用户数据 并在其中关联一个元表 我将在其中收集矩阵 我无法得到的是如何将初始化矩阵的每个分量设置为零 我按照我的描述编译我的 Lua 模块 C 代码here https stackoverflow
  • Python 读取未格式化的直接访问 Fortran 90 给出不正确的输出

    这是数据的写入方式 它是一个二维浮点矩阵 我不确定大小 open unit 51 file rmsd nn output form unformatted access direct status replace recl Npoints
  • Fortran gfortran linux 中的“分段错误(核心转储)”错误

    我正在创建一个程序 该程序将分析目录中的文件 fits 然后它将在另一个目录中创建另一个文件 txt 它只是一个转换器 当我尝试执行该程序 编译正常 时 它给了我一条错误消息 程序收到信号 SIGSEGV 分段错误 无效的内存引用 此错误的
  • javascript 多维类型数组 (Int8Array) 示例

    我尝试使用类型数组而不是数组来减少内存 function createarrayInt8 numrows numcols number var arr new Int8Array numrows for var i 0 i lt numro
  • 多维数组将每个列表数组存储在另一个数组中

    我嵌套了可能有 2 或 3 层深度的多维数组 在它里面我可能有也可能没有列表数组 我需要循环数组 Array 0 gt Array id gt 1 name gt cat name 1 list gt Array 1 gt swgdgbdg
  • 2D Numpy 数组花式索引 + 掩码

    I have import numpy as np a np array 4 99 2 3 4 99 1 8 7 8 6 8 Why is a True True False False 1 2 等于 array 99 99 And not
  • forrt1:严重(170):程序异常 - 堆栈溢出

    并提前感谢您的帮助 我已经编译了一个程序 不是我编写的 它在 Mac 上运行得很好 但是当我尝试在 Windows 上执行该程序时 在程序开始执行后不久 我收到以下错误消息 forrt1 严重 170 程序异常 堆栈溢出 我不是 ifort
  • GO TO 语句 - Fortran 到 Matlab

    我一直在努力将此网格搜索代码从 Fortran 转换为 Matlab 但是我无法正确合并 GO TO 语句 我正在尝试使用 while 循环 但我认为我需要其他东西来结束搜索 任何帮助将不胜感激 vmax 1 0E 15 amax G 1
  • Ruby 多维数组

    也许只是我缺乏在这里找到东西的能力 这就是问题所在 但我找不到任何关于如何在 Ruby 中创建多维数组的信息 有人可以给我一个如何做的例子吗 严格来说 在 Ruby 中创建多维数组是不可能的 但是可以将一个数组放入另一个数组中 这与多维数组
  • 多维数组 PHP 内爆 [重复]

    这个问题在这里已经有答案了 就我的数据结构而言 我有一个 communications 数组 每个 communications id 本身包含三部分信息 id score 和 content 我想内爆这个数组以获得逗号分隔的 id 列表
  • PHP 使用主键和辅助键对多维数组进行排序[重复]

    这个问题在这里已经有答案了 如何按主键和辅助键对多维数组进行排序 例如 假设有以下数组 result array result 0 prio 1 result 0 date 2010 02 28 result 0 post February
  • Fortran 内部计时例程,哪个更好? cpu_time 或 system_clock

    当对 FORTRAN 程序进行计时时 我通常只使用命令call cpu time t 然后我偶然发现call system clock count count rate count max 这似乎做了同样的事情 然而 在更加困难的庄园里 我
  • 这些双精度值如何精确到小数点后 20 位?

    当精度是一个问题时 我正在测试一些非常简单的等价错误 并希望以扩展双精度执行操作 这样我就知道答案在 19位数字中 然后以双精度执行相同的操作 其中第 16 位会有舍入误差 但不知何故 我的双精度算术保持了 19 位精度 当我在扩展双精度中
  • 在 Javascript 中创建数组

    我对 javascript 不太熟悉 并且在用 javascript 制作 2d 或者也许我可能需要 3d 数组时遇到了一些麻烦 我目前需要收集 2 条信息 一个 ID 和一个值 因此我创建了以下内容 var myArray var id
  • javaScript从单个值数组返回一个新的成对值数组[重复]

    这个问题在这里已经有答案了 可能的重复 将数组分割成块 https stackoverflow com questions 8495687 split array into chunks 我正在尝试将值数组转换为新的配对值数组 例如我需要转
  • 如何在 NumPy 中连接两个一维数组?

    我有两个数组A a1 an and B b1 bn 我想得到新的矩阵 C 等于 a1 b1 a2 b2 an bn 我该如何使用numpy concatenate 这个怎么样 很简单但是fastest解决方案 In 73 a np arra

随机推荐