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