private static PositiveDefiniteMatrix GetInverse(PositiveDefiniteMatrix A) { PositiveDefiniteMatrix result = new PositiveDefiniteMatrix(A.Rows, A.Cols); LowerTriangularMatrix L = new LowerTriangularMatrix(A.Rows, A.Cols); L.SetToCholesky(A); bool[] isZero = new bool[L.Rows]; for (int i = 0; i < L.Rows; i++) { if (L[i, i] == 0) { isZero[i] = true; L[i, i] = 1; } } L.SetToInverse(L); result.SetToOuterTranspose(L); for (int i = 0; i < isZero.Length; i++) { if (isZero[i]) { result[i, i] = double.PositiveInfinity; } } return(result); }
public static double[] Logh([SkipIfUniform] Gamma exp, [Proper] Gaussian d, double[] result) { if (dd == null) dd = Deriv2Matrix(n, 1/(inc*inc)); double b = exp.Rate; double dPrec = d.Precision; DenseVector aux = DenseVector.Zero(n); PositiveDefiniteMatrix denom = new PositiveDefiniteMatrix(n, n); denom.SetToOuterTranspose(dd); for (int i = 0; i < n; i++) { denom[i, i] += 1; } DenseVector logh = DenseVector.Zero(n); for (int i = 0; i < n; i++) { double x = xmin + i*inc; logh[i] = Math.Log(dPrec + b*Math.Exp(x)); } for (int iter = 0; iter < 100; iter++) { if (iter == 0) aux.SetToProduct(dd, logh); aux = Aux(exp, d, logh, aux); logh.SetToProduct(aux, dd); for (int i = 0; i < n; i++) { double x = xmin + i*inc; double target = dPrec + b*Math.Exp(x) + 0.5*aux[i]; if (target < 0) throw new Exception(); logh[i] += Math.Log(target); } logh.PredivideBy(denom); } for (int i = 0; i < n; i++) { result[i] = logh[i]; } return result; }