纯红宝石:快速计算稀疏矩阵等级(呃)

时间:2016-07-16 12:22:17

标签: ruby matrix sparse-matrix sketchup

如何加速纯红宝石中稀疏矩阵的秩计算?

我目前正在计算矩阵(std lib)的等级,以确定图表的刚性。 这意味着我有一个约2行* 9列到约300行* 300列的稀疏矩阵。 这转化为几秒钟的时间来确定矩阵的等级,这对于GUI应用来说非常慢。 因为我使用Sketchup,所以我绑定了Ruby 2.0.0。 我想避免在Windows上设置gcc的麻烦,所以nmatrix(我认为)不是一个好选择。

修改 示例矩阵:

[[12, -21, 0, -12, 21, 0, 0, 0, 0],
 [12, -7, -20, 0, 0, 0, -12, 7, 20],
 [0, 0, 0, 0, 14, -20, 0, -14, 20]]

EDIT2: 我使用整数而不是浮点数来加速它。 我之前在代码中添加了一个失败快速机制,以便根本不调用慢rank函数。

EDIT3: 部分代码

def rigid?(proto_matrix, nodes)
    matrix_base = Array.new(proto_matrix.size) { |index|
      # initialize the row with 0
      arr = Array.new(nodes.size * 3, 0.to_int)
      proto_row = proto_matrix[index]
      # ids of the nodes in the graph
      node_ids = proto_row.map { |hash| hash[:id] }
      # set the values of both of the nodes' positions
      [0, 1].each { |i|
        vertex_index = vertices.find_index(node_ids[i])
        # predetermined vector associated to the node
        vec = proto_row[i][:vec]
        arr[vertex_index * 3] = vec.x.to_int
        arr[vertex_index * 3 + 1] = vec.y.to_int
        arr[vertex_index * 3 + 2] = vec.z.to_int
      }
      arr
    }
    matrix = Matrix::rows(matrix_base, false)
    rank = matrix.rank
    # graph is rigid if the rank of the matrix is bigger or equal
    # to the amount of node coordinates minus the degrees of freedom
    # of the whole graph
    rank >= nodes.size * 3 - 6
end

0 个答案:

没有答案