gpt4 book ai didi

arrays - Fortran90 中的数组段算术

转载 作者:行者123 更新时间:2023-12-02 11:31:02 25 4
gpt4 key购买 nike

这段代码片段:

real*8 a(20,5,2)
real*8 b(5)
real*8 c(20,5,2)

! define a vals ....

! define b vals ....

c(1:20, :, 1:2) = a(1:20,:,1:2)*b

无法编译,因为 bac 的形状不同。当然,我希望 b 的五个值与 ac 中间索引的 5 个值匹配,但是 Fortran编译器不理解这一点。有什么方法可以告诉它我想要什么吗?我知道我可以在更大的数组中复制 b 以匹配 ac 的形状,但这会浪费内存。我也可以将整个事情放入循环中,但对于我试图编写的实际代码来说,这将很麻烦。还有其他可能吗?

最佳答案

我认为 Fortran 要么阻止你搬起石头砸自己的脚,要么,如果你愿意的话,坚持要求你清楚你想要相乘的数组元素。表达式

 a(1:20,:,1:2)

是第二个索引的每个值的 40 个元素的部分。根本不清楚 b 的 5 个元素要相乘。

我怀疑您正在寻找 spread 函数,该函数用于“升级”数组。如果没有澄清,很难提出 spread 的适当应用,也许如果您进一步解释,您会得到比这个更好的答案。

哎呀,让我们继续吧,无需澄清......

我将 OP 的意图解释为计算 c 的元素:

  DO ix = 1,5
c(:,ix,:) = a(:,ix,:)*b(ix)
END DO

可以替换为

  c = a * SPREAD(SPREAD(b,dim=1,ncopies=20),dim=3,ncopies=2)

我只进行了非常有限的测试,教训可能是遵循 @ptb 的建议,坚持使用 do 循环。

关于arrays - Fortran90 中的数组段算术,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49636315/

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