#pragma once
#include <iostream>
#include <vector>
#include <ctime>
#include <cmath>
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] = 0;
}
}
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 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];
}
}
bool operator== (matrix& mat)
{
float subtraction = this->SumNormsMatrix() - mat.SumNormsMatrix();
cout << this->SumNormsMatrix() << " " << mat.SumNormsMatrix() << " " << subtraction << endl;
if (subtraction == 0)
return 1;
else return 0;
}
bool operator> (matrix& mat)
{
float subtraction = this->SumNormsMatrix() - mat.SumNormsMatrix();
if (subtraction > 0)
return 1;
else return 0;
}
bool operator< (matrix& mat)
{
cout << "Оператор меньше " << endl;
float subtraction = this->SumNormsMatrix() - mat.SumNormsMatrix();
if (subtraction < 0)
return 1;
else return 0;
}
bool operator!= (matrix& mat)
{
float subtraction = this->SumNormsMatrix() - mat.SumNormsMatrix();
if (subtraction != 0)
return 1;
else return 0;
}
bool operator>= (matrix& mat)
{
float subtraction = this->SumNormsMatrix() - mat.SumNormsMatrix();
if (subtraction >= 0)
return 1;
else return 0;
}
bool operator<= (matrix& mat)
{
float subtraction = this->SumNormsMatrix() - mat.SumNormsMatrix();
if (subtraction <= 0)
return 1;
else return 0;
}
~matrix() {
if (a != NULL)
{
for (int i = 0; i < n; i++)
if (a[i] != NULL)
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];
}
}
};
class SymmetricMatrix : public SquareMatrix
{
public:
SymmetricMatrix() : SquareMatrix() {}
SymmetricMatrix(int n)
{
this->n = n;
this->m = n;
bool temp = 0;
a = new float* [n];
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
if (j <= i)
{
if (j == 0)
a[i] = new float[i + 1];
a[i][j] = 0;
}
}
SymmetricMatrix(SymmetricMatrix& mat)
{
this->n = mat.n;
this->m = mat.m;
a = new float* [n];
for (int i = 0; i < n; i++) {
a[i] = new float[i];
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++)
if (j <= i)
a[i][j] = rand() % 10;
}
~SymmetricMatrix()
{
if (a != NULL)
{
for (int i = 0; i < n; i++)
if (a[i] != NULL)
delete[] a[i];
delete[] a;
a = NULL;
}
}
void PrintMatrix()
{
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++)
{
if (j <= i)
cout << a[i][j] << "t";
else cout << "t";
}
cout << endl;
}
}
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++)
if (j <= i)
Sum[i] += a[j][i];
//Вторая норма
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
if (j <= i)
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++)
if (j <= i)
Sum[i] += a[i][j];
Norms[2] = max(Sum);
return Norms[0] + Norms[1] + Norms[2];
}
void Transposition()
{
cout << "Матрица не транспонируется..." << endl;
}
void operator= (SymmetricMatrix& 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[i];
for (int j = 0; j < m; j++)
if (j <= i)
a[i][j] = mat.a[i][j];
}
}
};
//Односвязный, двусвязный, очередь, стек, вектор рей, ассоциативный список мап, множество сет;