コード例 #1
0
ファイル: vector.c プロジェクト: kernsuite-debian/cassbeam
int gaussjordan(Matrix a, Vector b)
{
        double big, dum, pivinv, tmp;
        static int *indxc, *indxr, *ipiv;
	static int oldn = 0;
 	int i, icol = 0, irow = 0, j, k, l, ll;
	int m, n, p;

	g_assert(a != 0);
	g_assert(b != 0);
 
	n = MatrixSize1(a);
	m = MatrixSize2(a);
	p = Vectorlength(b);

	g_assert(m == n);
	g_assert(m == p);

	if(n != oldn)
	{
		oldn = n;
		if(oldn > 0)
		{
			g_free(indxc);
			g_free(indxr);
			g_free(ipiv);
		}
		if(n > 0)
		{
			indxc = g_new(int, n);
       			indxr = g_new(int, n);
        		ipiv  = g_new(int, n);
		}
コード例 #2
0
ファイル: vecarray.c プロジェクト: olebole/cassbeam
VecArray newVecArrayfromMatrix(const Matrix M)
{
	int i, j, m, n;
	VecArray a;

	g_assert(M);
	
	n = MatrixSize1(M);
	m = MatrixSize2(M);

	a = newVecArray(n);
	for(j = 0; j < n; j++) 
	{
		a[j] = newVector(m);
		for(i = 0; i < m; i++) a[j][i] = M[j][i];
	}

	return a;
}
コード例 #3
0
ファイル: vecarray.c プロジェクト: olebole/cassbeam
/* reduce symmetric matrix to tridiagonal form 
 *
 * From numerical recipes tred2
 */
VecArray tridiagfromMatrix(Matrix a)
{
	int n, i, j, k, l;
	double scale, hh, h, g, f;
	VecArray out;
	Vector d, e;

	g_assert(Matrixissquare(a));
	
	n = MatrixSize1(a);

	out = newpopulatedVecArray(2, n);
	d = out[0];
	e = out[1];

	for(i = n-1; i > 0; i--)
	{
		l = i-1;
		h = scale = 0.0;
		if(l > 0)
		{
			for(k = 0; k <= l; k++)
				scale += fabs(a[i][k]);
			if(scale == 0.0)
				e[i] = a[i][i];
			else
			{
				for(k = 0; k <= l; k++)
				{
					a[i][k] /= scale;
					h += a[i][k]*a[i][k];
				}
				f = a[i][i];
				g = (f >= 0.0 ? -sqrt(h) : sqrt(h));
				e[i] = scale*g;
				h -= f*g;
				a[i][l] = f - g;
				f = 0.0;
				for(j = 0; j <= l; j++)
				{
					a[j][i] = a[i][j]/h;
					g = 0.0;
					for(k = 0; k <= j; k++)
						g += a[j][k]*a[i][k];
					for(k = j+1; k <= l; k++)
						g += a[k][j]*a[i][k];
					e[j] = g/h;
					f += e[j]*a[i][j];
				}
				hh = 0.5*f/h;
				for(j = 0; j <= l; j++)
				{
					f=a[i][j];
					e[j] = g = e[j] - hh*f;
					for(k = 0; k <= j; k++)
						a[j][k] -= (f*e[k] + g*a[i][k]);
				}
			}
		}
		else e[i] = a[i][l];
		d[i] = h;
	}
	d[0] = e[0] = 0.0;

	for(i = 0; i < n; i++)
	{
		l = i - 1;
		if(i)
		{
			for(j = 0; j <= l; j++)
			{
				g = 0.0;
				for(k = 0; k <= l; k++)
					g += a[i][k]*a[k][j];
				for(k = 1; k <= l; k++)
					a[k][j] -= g*a[k][i];
			}
		}
		d[i] = a[i][i];
		a[i][i] = 1.0;
		for(j = 0; j <= l;j++) a[j][i] = a[i][j] = 0.0;
	}
	
	return out;
}