我真的很想评估你们中是否有人能指出我在Cholesky 分解方面最优化和计算速度最快的线性代数库。
到目前为止,我一直在使用Apache Commons Math库,但也许已经有更强大和更好增强的选项可用。
例如,会PColt
,EJML
还是ojAlgo
更好的选择?最紧迫的问题主要是一个:我需要迭代计算(通常在2048
元素for
循环内)最多三个不同矩阵的下三角 Cholesky 因子;矩阵将达到的最大尺寸约为2000x2000。
我真的很想评估你们中是否有人能指出我在Cholesky 分解方面最优化和计算速度最快的线性代数库。
到目前为止,我一直在使用Apache Commons Math库,但也许已经有更强大和更好增强的选项可用。
例如,会PColt
,EJML
还是ojAlgo
更好的选择?最紧迫的问题主要是一个:我需要迭代计算(通常在2048
元素for
循环内)最多三个不同矩阵的下三角 Cholesky 因子;矩阵将达到的最大尺寸约为2000x2000。
Cholesky 分解是一个非常简单的算法。这是我使用的(未优化的)C# 代码。C# 和 Java 非常相似,因此转换为 Java 并进行任何您认为必要的改进应该是一件容易的事。
public class CholeskyDecomposition {
public static double[,] Do(double[,] input) {
int size = input.GetLength(0);
if (input.GetLength(1) != size)
throw new Exception("Input matrix must be square");
double[] p = new double[size];
double[,] result = new double[size, size];
Array.Copy(input, result, input.Length);
for (int i = 0; i < size; i++) {
for (int j = i; j < size; j++) {
double sum = result[i, j];
for (int k = i - 1; k >= 0; k--)
sum -= result[i, k] * result[j, k];
if (i == j) {
if (sum < 0.0)
throw new Exception("Matrix is not positive definite");
p[i] = System.Math.Sqrt(sum);
} else
result[j, i] = sum / p[i];
}
}
for (int r = 0; r < size; r++) {
result[r, r] = p[r];
for (int c = r + 1; c < size; c++)
result[r, c] = 0;
}
return result;
}
}
查看Java 矩阵基准测试。“Inver Symm”案例测试使用 cholesky 分解反转矩阵。如果您获得了基准测试的源代码,那么您还可以打开一个纯 Cholesky 分解测试。
这是ojAlgo 和 JAMA 之间各种矩阵分解的另一个比较