Skip to content

Instantly share code, notes, and snippets.

@piekie
Forked from kateseniva/.cpp
Last active May 20, 2016 19:04
Show Gist options
  • Save piekie/25f4b4d21f01ea61b0820abefb213056 to your computer and use it in GitHub Desktop.
Save piekie/25f4b4d21f01ea61b0820abefb213056 to your computer and use it in GitHub Desktop.
Частина курсової
#include <iostream>
#include <vector>
#include <math.h>
#include <iomanip>
using namespace std;
//4 1 2 3 4 2 1 2 3 3 2 -1 2 4 3 2 1
vector <vector<double>> matrix_inverse(vector <vector<double>> &matr, unsigned int n) {
vector <vector<double>> inv;
inv.reserve(n + 1);
for (int i = 1; i <= n; i++) {
inv[i].reserve(n + 1);
}
double d = matr[1][1] * matr[2][2] - matr[1][2] * matr[2][1];
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
inv[i][j] = pow(-1, (i + j)) * matr[n - i + 1][n - j + 1] / d;
}
}
return inv;
}
vector <vector<double>> matrix_multiplication(vector <vector<double>> &matr, vector <vector<double>> &B,
unsigned int n) {
vector <vector<double>> C;
C.reserve(n + 1);
for (int i = 1; i <= n; i++) {
C[i].reserve(n + 1);
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
double s = 0;
for (int k = 1; k <= n; k++) {
s = s + matr[i][k] * B[k][j];
}
C[i][j] = s;
}
}
return C;
}
int main() {
unsigned int n = 0;
cout << "Enter n:";
cin >> n;
vector <vector<double>> A;
vector <vector<double>> A1;
vector <vector<double>> l11;
vector <vector<double>> l12;
vector <vector<double>> l21;
vector <vector<double>> l22;
A.resize(n + 1);
A1.resize(n + 1);
l11.resize(n + 1);
l12.resize(n + 1);
l21.resize(n + 1);
l22.resize(n + 1);
for (unsigned int i = 1; i <= n; i++) {
A[i].resize(n + 1);
A1[i].resize(n + 1);
l11[i].resize(n + 1);
l12[i].resize(n + 1);
l21[i].resize(n + 1);
l22[i].resize(n + 1);
}
cout << "Enter elements of matrix A:";
for (unsigned int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
cin >> A[i][j];
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (i <= n / 2) {
if (j <= n / 2)
l11[i][j] = A[i][j];
else
l12[i][j - n / 2] = A[i][j];
}
else {
if (j <= n / 2)
l21[i - n / 2][j] = A[i][j];
else
l22[i - n / 2][j - n / 2] = A[i][j];
}
}
}
vector <vector<double>> l11_inversed = matrix_inverse(l11, n / 2);
vector <vector<double>> X = matrix_multiplication(l11_inversed, l12, n / 2);
vector <vector<double>> Y = matrix_multiplication(l21, l11_inversed, n / 2);
vector <vector<double>> Q = matrix_multiplication(Y, l12, n / 2);
for (int i = 1; i <= n / 2; i++) {
for (int j = 1; j <= n / 2; j++) {
Q[i][j] = l22[i][j] - Q[i][j];
}
}
vector <vector<double>> Q_inversed = matrix_inverse(Q, n / 2);
vector <vector<double>> b11 = matrix_multiplication(Q_inversed, Y, n / 2);
b11 = matrix_multiplication(X, b11, n / 2);
vector <vector<double>> b12 = matrix_multiplication(X, Q_inversed, n / 2);
vector <vector<double>> b21 = matrix_multiplication(Q_inversed, Y, n / 2);
vector <vector<double>> b22 = Q_inversed;
for (int i = 1; i <= n / 2; i++) {
for (int j = 1; j <= n / 2; j++) {
b11[i][j] = l11_inversed[i][j] + b11[i][j];
b12[i][j] = (-1) * b12[i][j];
b21[i][j] = (-1) * b21[i][j];
}
}
cout << "inverse matrix:" << endl;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (i <= n / 2) {
if (j <= n / 2)
A1[i][j] = b11[i][j];
else
A1[i][j] = b12[i][j - n / 2];
}
else {
if (j <= n / 2)
A1[i][j] = b21[i - n / 2][j];
else
A1[i][j] = Q_inversed[i - n / 2][j - n / 2];
}
cout << setw(13) << A1[i][j];
}
cout << endl;
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment