Fortran90中的数组截面算法

bob*_*nto 2 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
Run Code Online (Sandbox Code Playgroud)

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

Hig*_*ark 5

我认为Fortran要么阻止你在脚下拍摄自己,要么就像你喜欢的那样,坚持要清楚你想要成倍增加的数组元素.表达方式

 a(1:20,:,1:2)
Run Code Online (Sandbox Code Playgroud)

是第二个索引的每个值的40个元素的一部分.一点也不清楚5个要素b是多少.

我怀疑你正在寻找spread一个用来'uprank'数组的函数.如果没有澄清,提出适当的应用是很困难的spread,也许如果你进一步解释,你会得到比这个更好的答案.

哎呀,让我们继续前进,不要澄清......

我解释OP的意图是计算c这样的元素:

  DO ix = 1,5
     c(:,ix,:) = a(:,ix,:)*b(ix)
  END DO
Run Code Online (Sandbox Code Playgroud)

可以替换为

  c = a * SPREAD(SPREAD(b,dim=1,ncopies=20),dim=3,ncopies=2)
Run Code Online (Sandbox Code Playgroud)

我已经给出了这个非常有限的测试,教训可能是遵循@ ptb的建议来坚持do循环.