代码之家  ›  专栏  ›  技术社区  ›  DYZ

大规模numpy矩阵中三角形不等式的检验

  •  2
  • DYZ  · 技术社区  · 6 年前

    我有一个对称的numpy矩阵 D 非负浮点数。一个数字 i 第四行 j th列表示对象之间的距离 J 不管是什么。矩阵很大(约10000行/列)。我想检查矩阵中的所有距离是否都服从三角形不等式,即: D[i,j]<=D[i,k]+D[k,j] 为了所有 , J , k .

    这个问题可以通过使用三重嵌套循环来解决,效率非常低。但是否有更快的矢量化解决方案?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Oscar Benjamin    6 年前

    当然,使用(未测试的)可以很容易地引导最里面的循环:

    for i in range(N):
        for j in range(i):
            assert all(D[i,j] <= D[i,:] + D[:,j])
    

    对于双矢量化,您可以循环通过 k (也未测试):

    for k in range(N):
        row = D[k,:].reshape(1, N)
        col = D[:,k].reshape(N, 1)
        assert all(D <= row + col)
    

    ( row + col 生成一个与 D )