我真的很想评估一下你们中是否有人可以为我指出最优化和计算速度最快的线性代数库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矩阵基准测试。"逆对称"的情况下,测试反转一个矩阵使用cholesky分解。如果您获得了基准测试的源代码,那么您也可以打开一个纯cholesky分解测试。
这是ojAlgo和JAMA之间各种矩阵分解的另一个比较