使用大型矩阵(即10000x10000及更大)的最快方法?

时间:2013-11-26 17:08:29

标签: c numpy cython lapack

我目前正在使用Cython,但我的代码涉及在循环中多次采用每个行/列组合的范数,因此即使1000x1000矩阵也非常慢。我正在考虑切换到C + LAPACK ..什么是使用大型矩阵的标准?

看起来,最昂贵的步骤涉及获取所有行/列组合的点积并循环遍历矩阵的上三角形。

矩阵并不稀疏。

2 个答案:

答案 0 :(得分:2)

尝试Numpy,1000x1000听起来有点小。
它在C中实现,可以利用线性代数库,因此它可以很快。阅读this
如果条目不多,请使用稀疏矩阵。

import numpy as np
A = np.random.rand(1000,1000)
np.linalg.norm(A, axis=1)    # takes me under 5 ms

如果您需要更具体的帮助,请提供更多详细信息。

答案 1 :(得分:1)

在C中,作为一般准则并且没有示例代码可供查看,您可以做的唯一优化矩阵操作的方法是确保使用连续的内存块,以便整个矩阵可以保存在处理器的缓存中(或者至少减少RAM交互到可能的最小值),即如果你动态分配内存,请为每个矩阵请求整个内存块,然后以算术方式处理索引:

for (i = 0;i < rows; i++)
{
  for (j = 0; j < columns; j++)
  {
     matrix[i*rows + j] = do_whatever();
   }
}
如果您更喜欢使用标准的[i] [j]符号,那么

或创建一组指向列开头的指针,尽管这种方法有可能降低性能,因为处理器必须处理2个数组而不是1个数组对于单个矩阵。如果您使用的是标准阵列,则无需担心。

您可以进行的另一项重要更改是计算的并行化(多线程)。

使用矩阵本质上很慢,只有在可以对数据做出某些假设时才能应用优化技巧,例如对称性或其他可以为您节省一些操作的属性。