【问题标题】:FAST Computation of Integer Basis for Kernel of a Matrix Using GPU使用 GPU 快速计算矩阵核的整数基
【发布时间】:2018-12-26 02:35:34
【问题描述】:

输入:n times m 矩阵 A 带有整数条目。例如考虑矩阵

A = [[2,1,0],[0,1,2]]

输出:A 的内核/空空间的整数基。例如对于上面的矩阵,整数基是

[[1,-2,1]]

我正在使用来自 stackoverflow post 的想法,首先计算一个有理基,然后通过与分母的 lcm 相乘来计算一个整数基,使用以下 (Python 2.7) 代码:

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 也将是一个改进。甚至在上述代码中更有效地使用循环和数据结构的建议也受到欢迎。

【问题讨论】:

    标签: python numpy gpu linear-algebra multicore


    【解决方案1】:

    Sympy 使用Gaussian Elimination 来计算B 的空空间。这是 $O(n^3)$,我假设这个计算是您代码中的瓶颈(但值得检查)。

    高斯消除可以通过同时进行所有消除来并行化。 GE 的算法相对简单,并且有许多浮点数的实现。但是,在我的简短搜索中,我没有看到其他可以使用有理数或整数来执行此操作的符号包(尽管您可能相对容易实现这一点)。

    为了使任务并行化而无需重写算法来查找零空间,您可以尝试的另一件事是将矩阵分成两组行,计算每行的零空间,然后计算交集的基计算的空空间。如果每组行都有相对较小的空空间,这将很有效,但如果它们都返回非常大的空空间,则效果不佳。

    【讨论】:

    • 谢谢。看来我将不得不实施高斯消除。
    猜你喜欢
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    • 2020-03-21
    • 2018-09-03
    • 2015-03-18
    • 1970-01-01
    • 1970-01-01
    • 2019-11-18
    相关资源
    最近更新 更多