00001
00009 #ifndef BS_CALC_INVERSE_MATRIX_H_
00010 #define BS_CALC_INVERSE_MATRIX_H_
00011
00012 namespace blue_sky
00013 {
00014
00021 template <typename matrix_t>
00022 inline void
00023 calc_inverse_matrix (int n, matrix_t &matrix)
00024 {
00025 BS_ASSERT (false && "NOT IMPL YET");
00026
00027 int i, j, k, l1, l2, l3, l;
00028 typename matrix_t::value_type temp;
00029 int *is = 0, *js = 0;
00030
00031 if (!(is = new int[n]) || !(js = new int[n]))
00032 {
00033 throw bs_exception ("calc_inverse_matrix", "can't allocate memory");
00034 }
00035
00036
00037 for (k = 0; k < n; k++)
00038 {
00039 temp = 0.;
00040
00041 for (i = k; i < n; i++)
00042 for (j = k, l1 = i * n + k; j < n; j++, l1++)
00043 if (fabs (matrix[l1]) > temp)
00044 {
00045 temp = fabs (matrix[l1]);
00046 is[k] = i;
00047 js[k] = j;
00048 }
00049
00050 if (temp < EPS_DIFF)
00051 {
00052 delete [] is;
00053 delete [] js;
00054
00055 throw bs_exception ("calc_inverse_matrix", "can't find inverse matrix");
00056 }
00057
00058 if (is[k] != k)
00059 for (j = 0, l1 = k * n, l2 = is[k] * n; j < n; j++, l1++, l2++)
00060 {
00061 temp = matrix[l1];
00062 matrix[l1] = matrix[l2];
00063 matrix[l2] = temp;
00064 }
00065
00066 if (js[k] != k)
00067 for (i = 0, l1 = k, l2 = js[k]; i < n; i++, l1 += n, l2 += n)
00068 {
00069 temp = matrix[l1];
00070 matrix[l1] = matrix[l2];
00071 matrix[l2] = temp;
00072 }
00073
00074 l = k * n + k;
00075 matrix[l] = 1. / matrix[l];
00076
00077 for (j = 0, l1 = k * n; j < n; j++, l1++)
00078 if (j != k)
00079 matrix[l1] *= matrix[l];
00080
00081 for (i = 0, l2 = k; i < n; i++, l2 += n)
00082 if (i != k)
00083 for (j = 0, l1 = i * n, l3 = k * n; j < n; j++, l1++, l3++)
00084 if (j != k)
00085 matrix[l1] -= matrix[l2] * matrix[l3];
00086
00087 for (i = 0, l1 = k; i < n; i++, l1 += n)
00088 if (i != k)
00089 matrix[l1] *= - matrix[l];
00090 }
00091
00092
00093 for (k = n - 1; k > -1; k--)
00094 {
00095 if (js[k] != k)
00096 for (j = 0, l1 = k * n, l2 = js[k] * n; j < n; j++, l1++, l2++)
00097 {
00098 temp = matrix[l1];
00099 matrix[l1] = matrix[l2];
00100 matrix[l2] = temp;
00101 }
00102
00103 if (is[k] != k)
00104 for (i = 0, l1 = k, l2 = is[k]; i < n; i++, l1 += n, l2 += n)
00105 {
00106 temp = matrix[l1];
00107 matrix[l1] = matrix[l2];
00108 matrix[l2] = temp;
00109 }
00110 }
00111
00112 delete [] is;
00113 delete [] js;
00114 }
00115
00116 }
00117
00118 #endif // #ifndef BS_CALC_INVERSE_MATRIX_H_
00119
00120