1
0
forked from leto/LeMA
LeMA/matrices.h

141 lines
3.6 KiB
C++

#include <string>
#include <vector>
#include <cassert>
#define assertm(exp, msg) assert((void(msg), exp))
class Matrix{
private:
std::vector<std::vector<float>> values;
public:
void Randomize();
void Randomize(float, float);
void Set(float);
void Factor(float);
void Add(float);
void Add(Matrix*);
void Sub(float);
void Sub(Matrix*);
void Print(std::string_view);
void Transpose();
// Constructors
Matrix(int, int);
};
// Constructs a zero matrix
Matrix::Matrix(int rows, int cols){
for(int m = 0; m < rows; m++){
std::vector<float> buffer = {};
for(int n = 0; n < cols; n++){
buffer.push_back(0.0F);
}
this->values.push_back(buffer);
}
}
// Add 2 matrices
void Matrix::Add(Matrix* other){
// Matrices need to be the same size
assertm(this->values.size() == other->values.size() &&
this->values[0].size() == other->values[0].size(),
"Matrices need to be the same size");
for(int m = 0; m < this->values.size(); m++){
for(int n = 0; n < this->values[m].size(); n++){
this->values[m][n] += other->values[m][n];
}
}
}
// Substract 2 matrices
void Matrix::Sub(Matrix* other){
// Matrices need to be the same size
assertm(this->values.size() == other->values.size() &&
this->values[0].size() == other->values[0].size(),
"Matrices need to be the same size");
for(int m = 0; m < this->values.size(); m++){
for(int n = 0; n < this->values[m].size(); n++){
this->values[m][n] -= other->values[m][n];
}
}
}
// Print a matrix in terminal, with a title
void Matrix::Print(std::string_view titre){
std::cout << titre << std::endl;
for(int m = 0; m < values.size(); m++){
std::cout << '|';
for(int n = 0; n < values[m].size(); n++){
std::cout << values[m][n] << "|";
}
std::cout << std::endl;
}
}
// Add a constant value to every matrix case
void Matrix::Add(float value){
for(int m = 0; m < this->values.size(); m++){
for(int n = 0; n < this->values[m].size(); n++){
this->values[m][n] += value;
}
}
}
// Substract a constant value to every matrix case
void Matrix::Sub(float value){
for(int m = 0; m < this->values.size(); m++){
for(int n = 0; n < this->values[m].size(); n++){
this->values[m][n] -= value;
}
}
}
// Multiply every matrix case by a given factor
void Matrix::Factor(float value){
for(int m = 0; m < this->values.size(); m++){
for(int n = 0; n < this->values[m].size(); n++){
this->values[m][n] *= value;
}
}
}
// Set a matrix to a given value
void Matrix::Set(float value){
this->Factor(0.0F);
this->Add(value);
}
// Transpose a matrix
void Matrix::Transpose(){
std::vector<std::vector<float>> buffer = this->values;
this->values = {};
// Invert matrix size
for(int m = 0; m < buffer[0].size(); m++){
std::vector<float> line = {};
for(int n = 0; n < buffer.size(); n++){
line.push_back(buffer[n][m]);
}
this->values.push_back(line);
}
}
// Randomize a matrix from 0.0F to 10.0F
void Matrix::Randomize(){
this->Randomize(0.0F, 10.0F);
}
// Randomize a matrix from min to max
void Matrix::Randomize(float min, float max){
for(int m = 0; m < this->values.size(); m++){
for(int n = 0; n < this->values[m].size(); n++){
this->values[m][n] = min + ((float)rand()/(float)(RAND_MAX)) * (max - min);
}
}
}