Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
112 changes: 112 additions & 0 deletions ResultMatrix.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
#pragma once
class ResultMatrix
{
private:
int *data;//������ ������

int block_quantity;//���-�� ������
int block_width;//������ ����� � ���������
int block_capacity;//���-�� ��������� � �����
int matrix_width;//������ ������� � ���������
int matrix_capacity;//���-�� ��������� � �������
int width_matrix_in_blocks;//������ ������� � ������

//��������� ������� ������� �������� ����������� �����
int getFirstElementBlock(int row, int column);
//��������� ������� �������� ��� ������ ����� ������������ ���������� ��������� � �������
int getElementBlock(int row, int column);

public:

ResultMatrix(int matrix_width, int block_width);//����������� �������������� �������
~ResultMatrix();//���������� �������������� �������

int getValue(int row, int column);//��������� �������� �� �������
int *getBlock(int blockY, int blockX);//��������� �����

int getWidthMatrixInBlocks();//��������� ������ ������� � ������
int getBlockCount();//��������� ���-�� ������
int getBlockWidth();//��������� ������ ������ �����
void zerofication();//��������� ���� ��������� �������
void printMatrix();
};


int ResultMatrix::getValue(int row, int column)
{
return data[getElementBlock(row, column)];
}

int* ResultMatrix::getBlock(int blockY, int blockX)
{
int* block = data + getFirstElementBlock(blockY, blockX);
return block;
}

int ResultMatrix::getBlockCount()
{
return block_quantity;
}

int ResultMatrix::getBlockWidth()
{
return block_width;
}

int ResultMatrix::getWidthMatrixInBlocks()
{
return width_matrix_in_blocks;
}

void ResultMatrix::zerofication()
{
for (int i = 0; i < matrix_capacity; i++)
data[i] = 0;
}

int ResultMatrix::getFirstElementBlock(int blockY, int blockX)
{
int block_number = blockX * width_matrix_in_blocks + blockY;
return block_number * block_capacity;
}

int ResultMatrix::getElementBlock(int row, int column)
{
// �������� ������ ����� �������� �� ��������
int element_number = (row % block_width) * block_width + (column % block_width);

int blockY = row / block_width;
int blockX = column / block_width;

int memory_shift = getFirstElementBlock(blockY, blockX);
return memory_shift + element_number;
}

ResultMatrix::ResultMatrix(int matrix_width, int block_width)
{
this->block_width = block_width;
this->matrix_width = matrix_width;

width_matrix_in_blocks = matrix_width / block_width;

block_quantity = (width_matrix_in_blocks) * (width_matrix_in_blocks);
block_capacity = block_width * block_width;

matrix_capacity = block_quantity * block_capacity;
data = new int[matrix_capacity];
}

ResultMatrix::~ResultMatrix() {
delete[] data;
}

void ResultMatrix::printMatrix() {
{
for (int i = 0;i < matrix_width;++i) {
for (int j = 0;j < matrix_width;++j)
std::cout << getValue(i, j) << " ";
std::cout << std::endl;
}
}
std::cout << std::endl;
}
186 changes: 186 additions & 0 deletions SymmetrMatrix.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,186 @@
#pragma once
#include <iostream>
#include <ctime>
#include <random>

class SymmetrMatrix
{
private:
int *data;//������ ������
int block_quantity;//���-�� ������
int block_width;//������ ����� � ���������
int block_capacity;//���-�� ��������� � �����
int matrix_width;//������ ������� � ���������
int matrix_capacity;//���-�� ��������� � �������
int width_matrix_in_blocks;//������ ������� � ������

//��������� ������� ������� �������� ����������� �����
int getFirstElementBlock(int row, int column);
//��������� ������� �������� ��� ������ ����� ������������ ���������� ��������� � �������
int getElementBlock(int row, int column);
//��������� ���� ��������� �������
void zerofication();

public:
//����������� ������������ �������
SymmetrMatrix(int matrix_width, int block_width);
//���������� ������������ �������
~SymmetrMatrix();

int getValue(int row, int column);//��������� �������� �� �������
void setValue(int row, int column, int value);//��������� �������� ����������� �������� �������
int *getBlock(int blockY, int blockX);//��������� �����
void readMatrixFromFile(std::string filePath);//������ ������� �� �����
void printMatrix();//����� ������� �� ������
void generateMatrix(int min_val, int max_val);

int*tmp;
};

int SymmetrMatrix::getFirstElementBlock(int blockY, int blockX)
{
// �� ��������
int block_number = blockY * width_matrix_in_blocks - ((2.0 + (double)blockY - 1) / 2.0)*(double)blockY + blockX;
return block_number * block_capacity;
}

int SymmetrMatrix::getElementBlock(int row, int column)
{
int element_number = (row%block_width) * block_width + (column%block_width);

int blockX = column / block_width;
int blockY = row / block_width;

int memory_shift = getFirstElementBlock(blockY, blockX);
return element_number + memory_shift;
}

void SymmetrMatrix::zerofication()
{
for (int i = 0; i < matrix_capacity; i++)
data[i] = 0;
}

SymmetrMatrix::SymmetrMatrix(int matrix_width, int block_width)
{
this->block_width = block_width;
this->matrix_width = matrix_width;

width_matrix_in_blocks = matrix_width / block_width;

block_quantity = width_matrix_in_blocks * width_matrix_in_blocks;
block_capacity = block_width * block_width;

int symmetric_block_quantity = 0;

for (int x = 0; x < matrix_width / block_width; x++)
for (int y = 0; y < matrix_width / block_width; y++)
if (x < y) symmetric_block_quantity++;

matrix_capacity = (block_quantity - symmetric_block_quantity) * block_capacity;
data = new int[matrix_capacity];

tmp = new int[block_capacity];

zerofication();
}

SymmetrMatrix::~SymmetrMatrix()
{
delete[] data;
delete[] tmp;
}

int SymmetrMatrix::getValue(int row, int column)
{
if (column < row)
{
std::swap(row, column);
}
return data[getElementBlock(column, row)];
}

void SymmetrMatrix::setValue(int row, int column, int new_value)
{
data[getElementBlock(row, column)] = new_value;
}

int* SymmetrMatrix::getBlock(int blockY, int blockX)
{
if (blockX > blockY)
{
std::swap(blockX, blockY);

int* block = data + getFirstElementBlock(blockY, blockX);

int index_in_tmp_block = 0;

for (int i = 0; i < block_width; i++)
{
for (int j = i; j < block_capacity; j += block_width)
{
tmp[index_in_tmp_block] = block[j];
index_in_tmp_block++;
}
}
return tmp;
}
else
{
int* block = data + getFirstElementBlock(blockY, blockX);
return block;
}
}


void SymmetrMatrix::readMatrixFromFile(std::string filePath) {
zerofication();
std::fstream in(filePath);
std::string line;
int i = 0;

while (std::getline(in, line)) {
int j = 0;
std::stringstream linestream(line);

int value;
while (linestream >> value)
{
setValue(i, j, value);
++j;
}
++i;
}

//if (in.is_open()) {
in.close();
//}
}

void SymmetrMatrix::printMatrix() {

for (int i = 0;i < matrix_width;++i) {
for (int j = 0;j < matrix_width;++j)
std::cout << getValue(i, j) << " ";
std::cout << std::endl;
}
std::cout << std::endl;
}

void SymmetrMatrix::generateMatrix(int min_val, int max_val)
{
std::mt19937 gen(time(0));
std::uniform_int_distribution<> uid(min_val, max_val);

for (int i = 0; i < matrix_width; i++)
for (int j = i; j < matrix_width; ++j)
{
int rnd_num = uid(gen);
//this->setValue(j, i, rnd_num);
this->setValue(i, j, rnd_num);
this->setValue(j, i, rnd_num);
}

}


Loading