我正在尝试在fortran中重写一些python代码,特别是行
separation[a, :] = sum(np.minimum(1 - distances, distances) ** 2)
重要的部分是使用np.minimum来获取两个多维数组的元素最小值。距离是N坐标(x,y,z)的(3,N)数组。我无法在fortran中找到类似的功能,所以我自己编写了:
do b = 1, N
temp = 0.0
do c = 1, 3
if ((1 - distances(c, b)) .LE. distances(c, b)) then
temp = temp + (1 - distances(c, b)) ** 2
else
temp = temp + (distances(c, b)) ** 2
end if
end do
separation(a, b) = temp
end do
不出所料,这段代码非常慢,我对fortran的经验不足,所以任何改进此代码或建议替代方法的建议都会受到高度赞赏。
我想也许where语句可能会有所帮助,因为python中的以下代码可以工作
separation[a, :] = sum(np.where(1 - distances <= distances, (1 - distances), distances) ** 2)
虽然fortran有声明,但它们似乎与python的工作方式不同,而且它们似乎在这里没什么用处。
答案 0 :(得分:0)
real a(2,4),b(4)
a=reshape([.1,.2,.3,.4,.5,.6,.7,.8],shape(a))
b=sum(min(1-a,a)**2,1)
write(*,'(4f5.2)')b
end
0.05 0.25 0.41 0.13
注意fortran&#39; s sum
默认情况下会对整个数组求和。