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); }
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; }
/* 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; }