Vector gauss(Matrix a) { Matrix ac(a); Vector xs(a.size()); for (int i = 0; i < xs.size(); ++i) xs[i] = i; for (int i = 0; i < ac.size(); ++i) { double max = fabs(a[i][i]), maxI = i, maxJ = i; for (int l = i; l < ac.size(); ++l) { for (int m = i; m < ac.size(); ++m) { if (fabs(ac[l][m]) > max) { max = fabs(ac[l][m]); maxI = l; maxJ = m; } } } if (maxI != i) ac = swap_rows(ac, i, maxI); if (maxJ != i) ac = swap_cols(ac, i, maxJ); swap(xs[i], xs[maxJ]); for (int k = i + 1; k < ac.size(); ++k) { double c = - ac[k][i] / ac[i][i]; for (int j = i; j < ac[0].size(); ++j) { ac[k][j] += c * ac[i][j]; } } for (int j = ac[0].size() - 1; j >= i; --j) { ac[i][j] /= ac[i][i]; } } Vector v(ac.size()); for (int i = ac.size() - 1; i >= 0; --i) { v[xs[i]] = ac[i][ac[0].size()-1]; for (int j = i + 1; j < ac.size(); ++j) { v[xs[i]] -= v[xs[j]] * ac[i][j]; } } return v; }
bool matrix::inverse() { if (n!=m) return false; matrix temp(n,n); temp=*this; matrix E(n,n); for(size_t i=0; i<n; i++) { for(size_t j=0; j<n; j++) { (i==j)?E.p[n*i+j]=1.0:E.p[n*i+j]=0.0; } } for(size_t k=0; k<n; k++) { size_t left_col,upper_row; bool has_nozero=false; for(size_t i=k; i<n; i++) { for(size_t j=k; j<n; j++) { if (p[i+j*n]!=0.0) { has_nozero=true; upper_row=j; break; } } if (has_nozero) { left_col=i; break; } } if (!has_nozero) { *this=temp; return false; } swap_cols(k,left_col); E.swap_cols(k,left_col); swap_rows(k,upper_row); E.swap_rows(k,upper_row); long double coeff=p[k*(n+1)]; divide_row(k,coeff); E.divide_row(k,coeff); for(size_t i=k+1; i<n; i++) { coeff=p[i*n+k]; sub_multed_row(k,i,coeff); E.sub_multed_row(k,i,coeff); } } for(size_t k=n-1; k>0; k--) { for(size_t i=k; i>0;) { long double coeff=p[--i*n+k]; sub_multed_row(k,i,coeff); E.sub_multed_row(k,i,coeff); } } *this=E; return true; }