private unsafe void LLt(double[,] value)
{
n = value.GetLength(0);
L = new double[n,n];
D = Matrix.Vector(n, 1.0);
robust = false;
double[,] a = value;
positiveDefinite = true;
symmetric = true;
fixed (double* ptrL = L)
{
for (int j = 0; j < n; j++)
{
double* Lrowj = ptrL + j*n;
double d = 0.0;
for (int k = 0; k < j; k++)
{
double* Lrowk = ptrL + k*n;
double s = 0.0;
for (int i = 0; i < k; i++)
s += Lrowk[i]*Lrowj[i];
Lrowj[k] = s = (a[j, k] - s)/Lrowk[k];
d += s*s;
symmetric = symmetric & (a[k, j] == a[j, k]);
}
d = a[j, j] - d;
positiveDefinite = positiveDefinite & (d > 0.0);
Lrowj[j] = System.Math.Sqrt(System.Math.Max(d, 0.0));
for (int k = j + 1; k < n; k++)
Lrowj[k] = 0.0;
}
}
}