这个代码片段:
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的形状,但这会浪费内存。我也可以将整件事情放在循环中,但对于我正在尝试编写的实际代码来说,这将是非常麻烦的。还有其他的可能性吗?
发布于 2018-04-03 18:04:37
我认为Fortran是在阻止你朝自己的脚开枪,或者,如果你愿意的话,坚持要求你清楚你想要乘的数组元素。表达式
a(1:20,:,1:2)是第二个索引的每一个值都包含40个元素的部分。现在还不清楚b的5个元素是什么。
我怀疑您正在寻找spread函数,它是用于“uprank”数组的函数。如果没有澄清,就很难提出适当的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循环。
https://stackoverflow.com/questions/49636315
复制相似问题