如何在python中有效地计算(稀疏)位矩阵上的矩阵乘积

时间:2016-06-01 16:44:37

标签: python scipy bit-manipulation intel-mkl

位数组之间的普通矩阵乘积:

           1, 0, 0
Matrix A = 1, 1, 1
           0, 0, 1

                 1, 1, 0
Transpose of A = 0, 1, 0
                 0, 1, 1

C = Matrix A times (Transpose of Matrix A)

    1, 1, 0
C = 1, 3, 1
    0, 1, 1

A是1和0的位数组。实际矩阵A很大,有大约0.25%的1个条目和99.75%的零条目。

C是一个整数数组。

如何在不使用大量内存的情况下快速计算出来?

目前,我正在使用scipy的稀疏矩阵乘法例程来处理python中浮点1.0和0.0的压缩稀疏行矩阵。我也试图直接调用mkl库中的c函数来减少内存使用。

1 个答案:

答案 0 :(得分:2)

现有的性能库(如MKL)始终使用float / double作为数据类型。比较将A转换为浮动CSR然后调用.dot()或某些MKL例程,您可能会发现编写自己的bit-mat-mul代码更快。你甚至不需要乘法运算。它只计算位数。

修改

在了解了关于排队的背景后,我建议采用以下程序。

  1. 将数组A转换为CSR格式并仅存储col索引和行ptr;
  2. 对于A的每一行i和行j,计算公共col索引的数量并且将结果存储在C(i,j)中,其中i <= j,因为C是对称的。如果col索引被排序,这是快速的。
  3. 密集的matric C就是你想要的。

    考虑到A的尺寸(b x 750,000)和密度(0.25%),C的密度为99.1%;每个col指数的平均长度是1875。

    所以你的问题在b*(b+1)/2次计算了2个1875-D矢量的共同元素的数量。

    for循环的速度似乎是唯一存在的问题。