我目前正在计算矩阵(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