Esempio n. 1
0
/*
*-----------------------------------------------------------------------------
*	funct:	mat_lsolve
*	desct:	solve linear equations
*	given:	a = square matrix A
*		b = column matrix B
*	retrn:	column matrix X (of AX = B)
*-----------------------------------------------------------------------------
*/
MATRIX mat_lsolve(MATRIX a,MATRIX b,MATRIX X)
{
	MATRIX	A, B, P;
	int n;

	n = MatCol(a);
	if ( ( A = mat_creat(n, n, UNDEFINED) ) == NULL )
		return (NULL);
	if ( ( B = mat_creat(n, 1, UNDEFINED) ) == NULL )
		return (NULL);
	mat_copy(a,A);
	mat_copy(b,B);
	if ( ( P = mat_creat(n, 1, UNDEFINED) ) == NULL )
		return (NULL);

	// if dimensions of C is wrong
	if ( MatRow(X) != n || MatCol(X) != 1 ) {
		printf("mat_lsolve error: incompatible output matrix size\n");
	    _exit(-1);
	// if dimensions of C is correct
	} else {

		mat_lu( A, P );
		mat_backsubs1( A, B, X, P, 0 );
	}
	mat_free(A);
	mat_free(B);
	mat_free(P);

	return(X);
}
Esempio n. 2
0
/*
*-----------------------------------------------------------------------------
*	funct:	mat_inv
*	desct:	find inverse of a matrix
*	given:	a = square matrix a
*	retrn:	square matrix Inverse(A)
*		NULL = fails, singular matrix, or malloc() fails
*		1 = success
*-----------------------------------------------------------------------------
*/
MATRIX mat_inv(MATRIX a, MATRIX C)
{
	MATRIX	A, B, P;
	int		i, n;

	n = MatCol(a);
	if ( (	A = mat_creat( n, n, UNDEFINED ) ) == NULL )
		return (NULL);
	mat_copy(a,A);
	if ( ( B = mat_creat( n, 1, UNDEFINED ) ) == NULL )
		return (NULL);
	if ( ( P = mat_creat( n, 1, UNDEFINED ) ) == NULL )
		return (NULL);

	// if dimensions of C is wrong
	if ( MatRow(a) != MatRow(C) || MatCol(a) != MatCol(C) ) {
		printf("mat_inv error: incompatible output matrix size\n");
		_exit(-1);
	// if dimensions of C is correct
	} else {
		/*
		*	- LU-decomposition -
		*	also check for singular matrix
		*/
		if (mat_lu(A, P) == -1) {
			mat_free(A);
			mat_free(B);
			mat_free(C);
			mat_free(P);
			printf("mat_inv error: failed to invert\n");
			return (NULL);
		}

		for (i=0; i<n; i++) {
			mat_fill(B, ZERO_MATRIX);
			B[i][0] = 1.0;
			mat_backsubs1( A, B, C, P, i );
		}
	}

	mat_free(A);
	mat_free(B);
	mat_free(P);

	if (C==NULL) {
			printf("mat_inv error: failed to invert\n");
			return(NULL);
	} else {
		return (C);
	}
}
Esempio n. 3
0
/*
 *-----------------------------------------------------------------------------
 * funct:  mat_inv
 * desct:  find inverse of a matrix
 * given:  a = square matrix a, and C, return for inv(a)
 * retrn:  square matrix Inverse(A), C
 *   NULL = fails, singular matrix
 *-----------------------------------------------------------------------------
 */
MATRIX mat_inv( MATRIX a , MATRIX C)
{
	MATRIX  A, B, P;
	int i, n;

#ifdef CONFORM_CHECK

	if(MatCol(a)!=MatCol(C))
	{
		error("\nUnconformable matrices in routine mat_inv(): Col(A)!=Col(B)\n");
	}

	if(MatRow(a)!=MatRow(C))
	{
		error("\nUnconformable matrices in routine mat_inv(): Row(A)!=Row(B)\n");
	}
#endif

	n = MatCol(a);
	A = mat_creat(MatRow(a), MatCol(a), UNDEFINED);
	A = mat_copy(a, A);
	B = mat_creat( n, 1, UNDEFINED );
	P = mat_creat( n, 1, UNDEFINED );



/*
 * - LU-decomposition -
 * also check for singular matrix
 */

	if (mat_lu(A, P) == -1)
	{

		mat_free(A);
		mat_free(B);
		mat_free(P);

		return (NULL);

	}
	else
	{

/* Bug??? was still mat_backsubs1 even when singular??? */

		for (i=0; i<n; i++)
		{
			mat_fill(B, ZERO_MATRIX);
			B[i][0] = 1.0;
			mat_backsubs1( A, B, C, P, i );
		}

		mat_free(A);
		mat_free(B);
		mat_free(P);

		return (C);

	}

}