我目前正在使用Cython,但我的代码涉及在循环中多次采用每个行/列组合的范数,因此即使1000x1000矩阵也非常慢。我正在考虑切换到C + LAPACK ..什么是使用大型矩阵的标准?
看起来,最昂贵的步骤涉及获取所有行/列组合的点积并循环遍历矩阵的上三角形。
矩阵并不稀疏。
答案 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个数组对于单个矩阵。如果您使用的是标准阵列,则无需担心。
您可以进行的另一项重要更改是计算的并行化(多线程)。
使用矩阵本质上很慢,只有在可以对数据做出某些假设时才能应用优化技巧,例如对称性或其他可以为您节省一些操作的属性。