Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- using namespace std;
- double** matrix(int rl, int cl){
- double** r = new double*[rl];
- for (int i = 0; i < rl; i++)
- r[i] = new double[cl];
- return r;
- }
- void remove(double** m, int rl){
- for (int i = 0; i < rl; i++)
- delete *(m+i);
- delete m;
- }
- void print(double** m, int rl, int cl){
- for (int i = 0; i < rl; i++){
- for (int j = 0; j < cl; j++){
- cout << m[i][j] << ", ";
- }cout << "\n";
- }
- }
- double** subMatrix(double** m, int si, int sj, int rl, int cl){
- double** sm = matrix(rl - 1, cl - 1);
- int ki = 0, kj = 0;
- for (int i = 0; i<rl; i++){
- if (si == i) continue;
- for (int j = 0; j<cl; j++){
- if (sj != j){
- sm[ki][kj] = m[i][j];
- if (kj == cl-1 - 1){
- kj = 0;
- }
- else{
- kj++;
- }
- }
- }
- ki++;
- }
- return sm;
- }
- double det(double** m, int rl, int cl){
- if (cl == 1 && rl == 1)
- return m[0][0];
- double d = 0;
- int p = 1;
- for (int i = 0; i<rl; i++){
- if (m[0][i] != 0){
- double** sm = subMatrix(m, 0, i, rl, cl);
- d += p*m[0][i] * det(sm, rl-1, cl-1);
- remove(sm, rl-1);
- }
- p *= -1;
- }
- return d;
- }
- double** inverse(double** m, int rl, int cl){
- double** inv = matrix(rl, cl);
- double d = det(m, rl, cl); int p;
- for (int i = 0; i < rl; i++){
- for (int j = 0; j < cl; j++){
- p = ((i + j) % 2 == 0) ? 1 : -1;
- double** sm = subMatrix(m, j, i, rl, cl);
- inv[i][j] = p*det(sm, rl - 1, cl - 1) / d;
- remove(sm, rl - 1);
- }
- }
- return inv;
- }
- int main(){
- double** m = matrix(3,3);
- m[0][0] = 1; m[0][1] = 2; m[0][2] = 3;
- m[1][0] = 11; m[1][1] = 5; m[1][2] = 6;
- m[2][0] = 7; m[2][1] = 8; m[2][2] = 9;
- print(m, 3, 3);
- cout << endl;
- double** inv = inverse(m, 3, 3);
- print(inv, 3, 3);
- remove(m, 3);
- remove(inv, 3);
- getchar();
- return 0;
- }
Add Comment
Please, Sign In to add comment