Добавил:
nyan
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:ИПОВС - 3 семестр / Lab5 / MatrixDLL / Matrix
.cpp#include "Matrix.h"
#include "stdlib.h"
#include "math.h"
#include "string.h"
#include <iostream>
using namespace std;
Matrix::Matrix(int s,double* r,double* c)
{
size = s;
collumn = (double*)calloc(size, sizeof(double));//new long double[size];
row = (double*)calloc(size, sizeof(double));;
row[0] = r[0];
collumn[0] = row[0];
for (int i = 0; i < s; i++)
{
row[i] = r[i];
collumn[i] = c[i];
}
x = (double*)calloc(size, sizeof(double));;
y = (double*)calloc(size, sizeof(double));;
left = (double*)calloc(size, sizeof(double));;
}
Matrix::Matrix(int n)
{
size = n;
row = (double*)calloc(size, sizeof(double));;
collumn = (double*)calloc(size, sizeof(double));;
x = (double*)calloc(size, sizeof(double));;
y = (double*)calloc(size, sizeof(double));;
left = (double*)calloc(size, sizeof(double));;
row[0] = abs((rand() / 100) + 500);
collumn[0] = row[0];
for (int i = 1; i < n; i++)
{
row[i] = rand() / 100;
collumn[i] = rand() / 100;
}
}
Matrix::Matrix(const Matrix & a)
{
size = a.size;
row = a.row;
collumn = a.collumn;
x = a.x;
y = a.y;
left = a.left;
}
Matrix& Matrix::operator=(const Matrix& a)
{
return Matrix(a);
}
double * Matrix::Solve(double* a)
{
double* x1 = (double*)calloc(size, sizeof(double));;
for (int i = 0; i < size; i++)
left[i] = a[i];
double* y1 = (double*)calloc(size, sizeof(double));;
double f = 0;
double g = 0;
double r = 0;
double s = 0;
double t = 0;
x[0] = 1 / GetE(0);
y[0] = x[0];
for (int k = 1; k < size; k++)
{
f = 0;
g = 0;
r = 0;
for (int i = 0; i < k; i++)
{
f += GetE(k - i) * x[i];
}
for (int i = -1; i > -k - 1; i--)
{
g += GetE(i) * y[-i - 1];
}
r = 1 / (1 - f * g);
s = -r * f;
t = -r * g;
for (int i = 0; i < size; i++)
{
x1[i] = x[i];
y1[i] = y[i];
}
for (int i = 0; i < size - 1; i++)
{
x[i] = x1[i] * r;
}
for (int i = 1; i < size; i++)
{
x[i] += y1[i - 1] * s;
}
for (int i = 0; i < size - 1; i++)
{
y[i] = x1[i] * t;
}
for (int i = 1; i < size; i++)
{
y[i] += y1[i - 1] * r;
}
}
for (int i = 0; i< size; i++)
{
double(Matrix::*f1)(int, int);
f1 = &Matrix::GetReverseMatrixElement;
double(Matrix::*f2)(int, int);
f2 = &Matrix::GetLeftElement;
x1[i] = GetMultiplyElement(f1,f2, i, 0, size);
}
return x1;
}
double Matrix::GetE(int i)
{
if (i > 0)
return row[i];
else
return collumn[-i];
}
double Matrix::GetElementM1(int i, int j)
{
if (j <= i)
return x[i - j];
else
return 0;
}
double Matrix::GetElementM2(int i, int j)
{
if (j >= i)
return y[size - 1 + i - j];
else
return 0;
}
double Matrix::GetElementM3(int i, int j)
{
if (i >= 1 && j < i)
return y[i - j - 1];
else return 0;
}
double Matrix::GetElementM4(int i, int j)
{
if (j > 0 && j > i)
return x[size + i - j];
else
return 0;
}
double Matrix::GetLeftElement(int i, int j)
{
return left[i];
}
double Matrix::GetMultiplyElement(double(Matrix::*a)(int, int),double(Matrix::*b)(int, int), int i, int j, int sizex2)
{
double tmp = 0;
for (int i1 = 0; i1 < sizex2; i1++)
{
tmp += ((*this).*a)(i, i1)*((*this).*b)(i1, j);
}
return tmp;
}
double Matrix::GetReverseMatrixElement(int i, int j)
{
long double p = GetMultiplyElement(&Matrix::GetElementM1, &Matrix::GetElementM2, i, j, size);
long double p2 = GetMultiplyElement(&Matrix::GetElementM3, &Matrix::GetElementM4, i, j, size);
return (p - p2) / x[0];
}
Matrix::~Matrix()
{
delete[] row;
delete[] collumn;
delete[] x;
delete[] y;
delete[] left;
}