【问题标题】:Manhattan distance Fortran曼哈顿距离 Fortran
【发布时间】:2014-03-13 17:38:14
【问题描述】:

我想根据公式计算Fortran中2个数组之间的曼哈顿距离:

d = Sum(|P(i)-R(i)|)

所以我在 Fortran 中做了一个代码:

function DistM(v, u, dim)
    integer dim
    real(8) v(dim), u(dim), DistM
    DistM=sum(abs(v-u))
end function DistM

我用这个来调用这个函数:

Coeff=DistM(tempvector1,tempvector2, dim)

但这似乎不起作用(我没有得到任何回报)。我还尝试取 2 的幂,然后对其进行 sqrt,但它会卡在 sqrt 上(如果我分步运行它)。 我尝试了另一个功能并且那个有效(见下文),但是这个不起作用:(:

function Roznica(v, u, dim)
        integer dim
        real(8) v(dim), u(dim), Rozn
        Rozn=sum((v-u)**2)/dim
end function Roznica

谁有想法?

【问题讨论】:

  • 告诉我们你是如何调用这个函数的。发布 SSCCE -- meta.stackexchange.com/questions/22754/…
  • 更新了高性能标志!
  • 发布 SSCCE。并解释你写I don't get any return时的意思。并将所有代码格式化为代码。
  • 这个 Coeff 应该只是给我一个数字......这不是那么花哨的代码......当我调用 Roznica 函数时,那个工作,但不是 DistM 函数。我想我知道我的代码中存在什么问题。我会检查一些东西并回到它。打扰了
  • real (8)real*8 不同,不可移植。

标签: fortran fortran90 fortran77 fortran95


【解决方案1】:

我会像这样简单地编写一个曼哈顿距离函数(使用假定形状的数组,您不再需要像您那样使用自动数组,前提是该函数具有显式接口):

pure function L1(v)
  real, intent(in) :: v(:)  ! <- shape assumed from actual argument
  real :: L1
  L1 = sum(abs(v))
end function

然后,如果您有两个向量,您只需将函数称为 foo = L1(p - q)

【讨论】:

  • 注意:这只是一个如何在现代 Fortran 中执行此操作的示例,而不是您的代码为什么不起作用的答案。作为惠普马克说,需要更多信息。
  • 感谢您提及这一点。我已经改了!关于我的代码:我在其他部分犯了一个愚蠢的小错误,所以现在我解决了!感谢 HP Mark 所说的(返回值的事情)。无论如何,感谢您的时间!
  • 我对这个问题投了反对票。发现我浪费了时间试图诊断 OP 不共享的代码中的问题,这让我非常恼火。
猜你喜欢
  • 1970-01-01
  • 2012-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多