Пример #1
0
double mxm_invert(double *r, const double *a, const int N)
{
    mxm_local_block(a2, double, N);
    mxm_set(a2, a, N);
    double det = internal_invert(a2, r, N);
    mxm_free_local(a2);
    return det;
}
Пример #2
0
real mxm_invert(real *r, const real *a, const int N)
{
    mxm_local_block(a2, real, N);
    mxm_set(a2, a, N);
    real det = internal_invert(a2, r, N);
    mxm_free_local(a2);
    return det;
}
Пример #3
0
double mxm_solve(double *x, const double *A, const double *b, const int N)
{
    mxm_local_block(a2, double, N);
    mxm_set(a2, A, N);
    mxv_set(x, b, N);
    double det = internal_solve(a2, x, N);
    mxm_free_local(a2);
    return det;
}
Пример #4
0
real mxm_solve(real *x, const real *A, const real *b, const int N)
{
    mxm_local_block(a2, real, N);
    mxm_set(a2, A, N);
    mxv_set(x, b, N);
    real det = internal_solve(a2, x, N);
    mxm_free_local(a2);
    return det;
}
Пример #5
0
// Originally based on public domain code by <*****@*****.**>
// which can be found at http://lib.stat.cmu.edu/general/ajay
//
// The factorization is valid as long as the returned nullity == 0
// U contains the upper triangular factor itself.
//
int mxm_cholesky(double *U, const double *A, const int N)
{
    double sum;

    int nullity = 0;
    mxm_set(U, 0.0, N);

    for(int i=0; i<N; i++)
    {
	/* First compute U[i][i] */
	sum = mxm_ref(A, i, i, N);

	for(int j=0; j<=(i-1); j++)
	    sum -= mxm_ref(U, j, i, N) * mxm_ref(U, j, i, N);

	if( sum > 0 )
	{
	    mxm_ref(U, i, i, N) = _sqrt(sum);

	    /* Now find elements U[i][k], k > i. */
	    for(int k=(i+1); k<N; k++)
	    {
		sum = mxm_ref(A, i, k, N);

		for(int j=0; j<=(i-1); j++)
		    sum -= mxm_ref(U, j, i, N)*mxm_ref(U, j, k, N);
		
		mxm_ref(U, i, k, N) = sum / mxm_ref(U, i, i, N);
	    }
	}
	else
	{
	    for(int k=i; k<N; k++) mxm_ref(U, i, k, N) = 0.0;
	    nullity++;
	}
    }

    return nullity;
}