如何节省求解对称(或上三角)矩阵的内存?
How save memory for a solving a symmetric (or upper traingular) matrix?
我需要求解线性代数方程组A.X = B
矩阵 A 是双精度的,大小约为 33000x33000,我尝试分配它时会出错:
Cannot allocate array - overflow on array size calculation.
由于我将 LAPACK dposv
与英特尔 MKL 库一起使用,我想知道是否有办法以某种方式将较小的矩阵传递给库函数? (因为只需要求解一半的矩阵数组)
dposv
函数只需要A的上三角矩阵或下三角矩阵。Here is more details about dposv.
更新:请注意 A 矩阵是 N x N,但它需要 lda: INTEGER
作为 The leading dimension of a; lda ≥ max(1, n)
。那么可能有一种方法可以将 A 解析为一维数组吗?
如错误所述(无法分配数组 - 数组大小计算溢出)您的问题似乎出在其他地方:尤其是用于在内部计算数组大小的整数类型的限制。而且我怕你加内存也不一定能解决。您将需要检查用于内存管理的库的内部结构(可能是 MKL,但我不使用 MKL,所以我无能为力)或选择另一个。
说明,一些函数在分配时使用4字节整数来计算内存大小。这为您提供了 2^32
或 4 GB 内存的限制,您可以分配的内存比 8 GB 数组低得多。因为我假设无符号整数;对于有符号整数,该限制为 2 GB。
如果您的记忆力有限,提示:
如果您没有足够的内存(因为它是三角形的,仅矩阵就需要大约 4 GB)并且您不知道矩阵的结构,那么请忘记特殊的求解器并自己解决您的问题。求解具有上三角矩阵的系统是向后替换。从解的最后一行开始,您只需要矩阵的一行来计算解的每个分量。
想办法从最后一行开始逐行加载矩阵。
感谢mecej4
有几个选项可以使用更少的内存来传递一个巨大的矩阵:
使用支持Matrix Storage Schemes e.g. ?pbsv
的函数
使用PARDISO
我需要求解线性代数方程组A.X = B
矩阵 A 是双精度的,大小约为 33000x33000,我尝试分配它时会出错:
Cannot allocate array - overflow on array size calculation.
由于我将 LAPACK dposv
与英特尔 MKL 库一起使用,我想知道是否有办法以某种方式将较小的矩阵传递给库函数? (因为只需要求解一半的矩阵数组)
dposv
函数只需要A的上三角矩阵或下三角矩阵。Here is more details about dposv.
更新:请注意 A 矩阵是 N x N,但它需要 lda: INTEGER
作为 The leading dimension of a; lda ≥ max(1, n)
。那么可能有一种方法可以将 A 解析为一维数组吗?
如错误所述(无法分配数组 - 数组大小计算溢出)您的问题似乎出在其他地方:尤其是用于在内部计算数组大小的整数类型的限制。而且我怕你加内存也不一定能解决。您将需要检查用于内存管理的库的内部结构(可能是 MKL,但我不使用 MKL,所以我无能为力)或选择另一个。
说明,一些函数在分配时使用4字节整数来计算内存大小。这为您提供了 2^32
或 4 GB 内存的限制,您可以分配的内存比 8 GB 数组低得多。因为我假设无符号整数;对于有符号整数,该限制为 2 GB。
如果您的记忆力有限,提示:
如果您没有足够的内存(因为它是三角形的,仅矩阵就需要大约 4 GB)并且您不知道矩阵的结构,那么请忘记特殊的求解器并自己解决您的问题。求解具有上三角矩阵的系统是向后替换。从解的最后一行开始,您只需要矩阵的一行来计算解的每个分量。
想办法从最后一行开始逐行加载矩阵。
感谢mecej4
有几个选项可以使用更少的内存来传递一个巨大的矩阵:
使用支持Matrix Storage Schemes e.g. ?pbsv
的函数
使用PARDISO