Beispiel #1
0
        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);
        }
Beispiel #2
0
		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;
		}