输入:具有整数条目的n times m
矩阵A
。例如考虑矩阵
A = [[2,1,0],[0,1,2]]
输出:A
的内核/空空间的整数基础。例如,对于上述矩阵,整数基为
[[1,-2,1]]
我正在使用stackoverflow post中的想法,首先计算有理基础,然后通过乘以下面的{Python 2.7
)代码与分母的lcm相乘来计算整数基础:
import numpy as np
from sympy import Matrix,lcm
from fractions import Fraction
def ker_int_basis(B):
BKer = 1.0*np.array(Matrix(B).nullspace())
Bk =[]
for basis in BKer:
l = lcm(map(lambda x: Fraction(x).limit_denominator().denominator,map(str,basis)))
basis = map(int,l*basis)
Bk.append(basis)
Bk = np.array(Bk)
return Bk
它适用于一些小例子。但是上面的代码很慢,而且我的矩阵是10000 times 500
或更大。上面的代码即使运行数小时也不会输出。
如何使代码更快?考虑到矩阵非常大,我宁愿使用GPU实现。多核CPU也将有所改进。即使是在上述代码中更有效地使用循环和数据结构的建议,也值得欢迎。
答案 0 :(得分:0)
Sympy使用Gaussian Elimination计算B
的空空间。这是$ O(n ^ 3)$,我认为此计算是代码中的瓶颈(但值得检查)。
可以通过同时执行所有消除来并行化高斯消除。 GE的算法相对简单,那里有很多浮点数的实现。但是,在简短搜索中,我没有看到其他使用有理数或整数来执行此操作的符号包(尽管您可以相对容易地实现这一点)。
为了使任务并行化而无需重写算法来查找空空间的另一种尝试是将矩阵分成两行,计算每行的空空间,然后计算计算的空空间。如果每组行的空白空间都比较小,这会很好,但是如果它们都返回非常大的空白空间,那将不是很好。