#pragma once
#include <iostream>
#include <vector>
#include <ctime>
using namespace std;
class matrix {
protected:
int n;
int m;
float** a;
public:
matrix() {
n = 0;
m = 0;
a = NULL;
}
matrix(int n)
{
this->n = n;
this->m = n;
a = new float* [n];
for (int i = 0; i < n; i++) {
a[i] = new float[m];
for (int j = 0; j < m; j++)
a[i][j] = 2;
}
}
matrix(int n, int m)
{
this->n = n;
this->m = m;
a = new float* [n];
for (int i = 0; i < n; i++) {
a[i] = new float[m];
for (int j = 0; j < m; j++)
a[i][j] = 0;
}
}
matrix(matrix& mat) {
this->n = mat.n;
this->m = mat.m;
a = new float* [n];
for (int i = 0; i < n; i++) {
a[i] = new float[m];
for (int j = 0; j < m; j++)
a[i][j] = mat.a[i][j];
}
}
void FillRandomMatrix() {
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++)
a[i][j] = (rand() + time(0)) % 10;
}
}
void PrintMatrix() {
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++)
cout << a[i][j] << " ";
cout << endl;
}
cout << endl;
}
void setElement(int j, int i, float a) {
this->a[j][i] = a;
}
matrix Transposition() {
matrix b(m, n);
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
b.setElement(j, i, a[i][j]);
}
}
return b;
}
float max(const vector <float> value)
{
float max;
max = value[0];
for (int i = 0; i < value.size()-1; i++)
{
if (value[i + 1] > value[i])
max = value[i + 1];
}
return max;
}
float min(const vector <float> value)
{
float min;
min = value[0];
for (int i = 0; i < value.size() - 1; i++)
{
if (value[i + 1] < value[i])
min = value[i + 1];
}
return min;
}
float SumNormsMatrix() {
vector <float> Norms = {0,0,0};
vector <float> Sum;
//Первая норма
Sum.resize(m);
for (int i = 0; i < m; i++)
Sum[i] = 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
Sum[i] += a[j][i];
//Вторая норма
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
Norms[1] += a[i][j]*a[i][j];
Norms[1] = sqrt(Norms[1]);
//Третья норма
Sum.clear();
Sum.resize(n);
for (int i = 0; i < n; i++)
Sum[i] = 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
Sum[i] += a[i][j];
Norms[2] = max(Sum);
return Norms[0] + Norms[1] + Norms[2];
}
void operator= (matrix& mat) {
if (this == &mat)
return;
if (a != NULL)
{
for (int i = 0; i < n; i++)
delete[] a[i];
delete[] a;
}
this->n = mat.n;
this->m = mat.m;
a = new float* [n];
for (int i = 0; i < n; i++) {
a[i] = new float[m];
for (int j = 0; j < m; j++)
a[i][j] = mat.a[i][j];
}
}
~matrix() {
if (a != NULL)
{
for (int i = 0; i < n; i++)
delete[] a[i];
delete[] a;
}
}
// Конец первой лабы
};
class SquareMatrix : public matrix
{
public:
SquareMatrix() : matrix() {}
SquareMatrix(int n) : matrix(n) {}
SquareMatrix(SquareMatrix& mat)
{
this->n = mat.n;
this->m = mat.n;
a = new float* [n];
for (int i = 0; i < n; i++) {
a[i] = new float[n];
for (int j = 0; j < n; j++)
a[i][j] = mat.a[i][j];
}
}
bool operator== (SquareMatrix& mat)
{
cout << this->SumNormsMatrix() << endl;
cout << mat.SumNormsMatrix() << endl;
if (((this->SumNormsMatrix() - mat.SumNormsMatrix()) < 1e-7)&&((this->SumNormsMatrix() - mat.SumNormsMatrix())>0))
return 1;
else return 0;
}
};
class SymmetricMatrix : public SquareMatrix
{
public:
SymmetricMatrix() : SquareMatrix() {}
SymmetricMatrix(int n) : SquareMatrix(n) {}
SymmetricMatrix(SymmetricMatrix& mat) : SquareMatrix(mat) {}
void FillRandomMatrix()
{
int j = 0;
for (int i = 0; i < n; i++)
{
while (j <= i)
{
a[i][j] = (rand()+time(0)) % 10;
a[j][i] = a[i][j];
j++;
}
j = 0;
}
}
};