python的Fortran等价物最小数量

2024-04-19 17:48:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试用fortran重新编写一些python代码,特别是行

separation[a, :] = sum(np.minimum(1 - distances, distances) ** 2)

最重要的是使用np.最小值取两个多维数组的元素最小值。距离是由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有where语句,但它们的工作方式似乎与python的不同,在这里似乎没有太多用处。你知道吗


Tags: 方法函数代码ifnp数组wheredo
1条回答
网友
1楼 · 发布于 2024-04-19 17:48:38

几乎是一样的。大多数fortran内部函数在数组上按组件操作(假设您至少有fortran95)

 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的sum默认情况下会对整个数组求和。你知道吗

相关问题 更多 >