int RbfInvMatrix(RbfFloatMatrix *m) { register int i, j; register int *indx; register float *b; register int tmp_err; RbfFloatMatrix help; #ifdef DEBUG_MODE if (m -> rows != m -> columns) ErrMess("RbfInvMatrix: matrix not of form N x N.\n"); #endif if (!RbfAllocMatrix(m -> rows, m -> rows, &help) || (indx = (int *) malloc(m -> rows * sizeof(int))) == NULL || (b = (float *) malloc(m -> rows * sizeof(float))) == NULL) { ErrMess("RbfInvMatrix: impossible to allocate helpmatrix.\n"); return KRERR_INSUFFICIENT_MEM; } RbfSetMatrix(&help, m); if ((tmp_err = RbfLUDcmp(&help, indx)) != 1) { free(b); free(indx); RbfFreeMatrix(&help); return tmp_err; } for (j = 0; j < m -> rows; j++) { for (i = 0; i < m -> rows; i++) b[i] = 0.0; b[j] = 1.0; RbfLUBksb(&help, indx, b); for (i = 0; i < m -> rows; i++) RbfMatrixSetValue(m, i, j, b[i]); } free(b); free(indx); RbfFreeMatrix(&help); return 1; }
int SnnsCLib::RbfInvMatrix(RbfFloatMatrix *m) { RbfFloatMatrix help; int i, j, r, k, n; float max, hr, hi; #ifdef DEBUG_MODE if (m -> rows != m -> columns) ErrMess(const_cast<char*>("RbfInvMatrix: matrix not of form N x N.\n")); #endif n = m -> rows; /* n = dimension of matrix */ /* allocate helpmatrix: 0. row: field p[N] of algorithm */ /* 1. row: field hv[N] of algorithm */ if (!RbfAllocMatrix(2, n, &help)) { ErrMess(const_cast<char*>("RbfInvMatrix: impossible to allocate helpmatrix.\n")); return KRERR_INSUFFICIENT_MEM; } /* initialize permutation field: */ for (j = 0; j < n; j++) RbfMatrixSetValue(&help, 0, j, (float) j); /* invert matrix: */ /* notation in comments: m[r,c] means element at row r column c */ for (j = 0; j < n; j++) { /* looking for pivot: */ /* find row r, where r >= j and m[r,j] is maximal */ max = fabs(RbfMatrixGetValue(m, j, j)); r = j; for (i = j+1; i < n; i++) { hi = fabs(RbfMatrixGetValue(m, j, i)); if (hi > max) { max = hi; r = i; } } /* test if matrix is singulary: */ /* if true, then return directly and report errorcode */ if (max == 0.0) { RbfFreeMatrix(&help); return 0; } /* if r != j (r > j) then switch row r with row j and mark */ /* this in helpmatrix: */ if (r > j) { for (k = 0; k < n; k++) { hr = RbfMatrixGetValue(m, j, k); RbfMatrixSetValue(m, j, k, RbfMatrixGetValue(m, r, k)); RbfMatrixSetValue(m, r, k, hr); } hi = RbfMatrixGetValue(&help, 0, j); RbfMatrixSetValue(&help, 0, j, RbfMatrixGetValue(&help, 0, r)); RbfMatrixSetValue(&help, 0, r, hi); } /* do the transformation: */ hr = 1.0 / RbfMatrixGetValue(m, j, j); for (i = 0; i < n; i++) { RbfMatrixSetValue(m, i, j, hr * RbfMatrixGetValue(m, i, j)); } RbfMatrixSetValue(m, j, j, hr); for (k = 0; k < n; k++) if (k != j) { for (i = 0; i < n; i++) if (i != j) { RbfMatrixSetValue(m, i, k, RbfMatrixGetValue(m, i, k) - RbfMatrixGetValue(m, i, j) * RbfMatrixGetValue(m, j, k)); } RbfMatrixSetValue(m, j, k, -hr * RbfMatrixGetValue(m, j, k)); } } /* now switch back the columns: */ for (i = 0; i < n; i++) { for (k = 0; k < n; k++) RbfMatrixSetValue(&help, 1, (int) RbfMatrixGetValue(&help, 0, k), RbfMatrixGetValue(m, i, k)); for (k = 0; k < n; k++) RbfMatrixSetValue(m, i, k, RbfMatrixGetValue(&help, 1, k)); } /* report success: */ RbfFreeMatrix(&help); return 1; }