Fortran90中的数组截面算法

时间:2018-04-03 17:51:36

标签: arrays fortran sections

此代码片段:

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

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

1 个答案:

答案 0 :(得分:5)

我认为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循环。