diff --git a/README.md b/README.md index 609857f..720e905 100644 --- a/README.md +++ b/README.md @@ -89,6 +89,6 @@ result_matrix.show(); ## ToDo -- [ ] Add arithmetic operations for 3-Dimensional matrices - - [ ] Add multiplication of 3D-matrices - - [ ] Add addition/subtraction of 3D-matrices \ No newline at end of file +- [x] Add arithmetic operations for 3-Dimensional matrices + - [x] Add multiplication of 3D-matrices + - [x] Add addition/subtraction of 3D-matrices diff --git a/src/headers/three_dimensional_matrix.hh b/src/headers/three_dimensional_matrix.hh index 489fa9b..9e24350 100644 --- a/src/headers/three_dimensional_matrix.hh +++ b/src/headers/three_dimensional_matrix.hh @@ -1,16 +1,101 @@ #ifndef THREE_DIMENSIONAL_MATRIX_HH #define THREE_DIMENSIONAL_MATRIX_HH -#include "two_dimensional_matrix.hh" +#include +#include +#include +#include -template ::value>> +template class ThreeDimensionalMatrix { - public: - ThreeDimensionalMatrix(); // Constructor - ~ThreeDimensionalMatrix(); // Desctructor + ThreeDimensionalMatrix(std::size_t x, std::size_t y, std::size_t z) + : dimX(x), dimY(y), dimZ(z), matrix(x, std::vector>(y, std::vector(z, 0))) {} + + void set_value(std::size_t x, std::size_t y, std::size_t z, T value) { + if (x >= dimX || y >= dimY || z >= dimZ) { + throw std::out_of_range("Index out of bounds"); + } + matrix[x][y][z] = value; + } + + T get_value(std::size_t x, std::size_t y, std::size_t z) const { + if (x >= dimX || y >= dimY || z >= dimZ) { + throw std::out_of_range("Index out of bounds"); + } + return matrix[x][y][z]; + } + + void show() const { + for (size_t i = 0; i < dimX; ++i) { + for (size_t j = 0; j < dimY; ++j) { + for (size_t k = 0; k < dimZ; ++k) { + std::cout << matrix[i][j][k] << " "; + } + std::cout << std::endl; + } + std::cout << "-----" << std::endl; + } + } + ThreeDimensionalMatrix operator+(const ThreeDimensionalMatrix& rhs) { + if (dimX != rhs.dimX || dimY != rhs.dimY || dimZ != rhs.dimZ) { + throw std::invalid_argument("Matrices dimensions do not match"); + } + + ThreeDimensionalMatrix result(dimX, dimY, dimZ); + for (size_t i = 0; i < dimX; ++i) { + for (size_t j = 0; j < dimY; ++j) { + for (size_t k = 0; k < dimZ; ++k) { + result.set_value(i, j, k, this->get_value(i, j, k) + rhs.get_value(i, j, k)); + } + } + } + return result; + } + + ThreeDimensionalMatrix operator-(const ThreeDimensionalMatrix& rhs) { + if (dimX != rhs.dimX || dimY != rhs.dimY || dimZ != rhs.dimZ) { + throw std::invalid_argument("Matrices dimensions do not match"); + } + + ThreeDimensionalMatrix result(dimX, dimY, dimZ); + for (size_t i = 0; i < dimX; ++i) { + for (size_t j = 0; j < dimY; ++j) { + for (size_t k = 0; k < dimZ; ++k) { + result.set_value(i, j, k, this->get_value(i, j, k) - rhs.get_value(i, j, k)); + } + } + } + return result; + } + + ThreeDimensionalMatrix operator*(const ThreeDimensionalMatrix& rhs) { + // Simplified multiplication for demonstration purposes + if (dimY != rhs.dimX || dimZ != rhs.dimY) { + throw std::invalid_argument("Matrices dimensions do not allow multiplication"); + } + + ThreeDimensionalMatrix result(dimX, rhs.dimY, rhs.dimZ); + for (size_t i = 0; i < dimX; ++i) { + for (size_t j = 0; j < rhs.dimY; ++j) { + for (size_t k = 0; k < rhs.dimZ; ++k) { + T sum = 0; + for (size_t l = 0; l < dimY; ++l) { + for (size_t m = 0; m < dimZ; ++m) { + sum += this->get_value(i, l, m) * rhs.get_value(l, j, m); + } + } + result.set_value(i, j, k, sum); + } + } + } + return result; + } +private: + std::vector>> matrix; + std::size_t dimX, dimY, dimZ; }; -#endif // THREE_DIMENSIONAL_MATRIX_HH \ No newline at end of file +#endif // THREE_DIMENSIONAL_MATRIX_HH diff --git a/src/main.cpp b/src/main.cpp index 722e836..01583a7 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -21,5 +21,47 @@ int main(int argc, const char** argv) { auto runtime_microseconds = std::chrono::duration_cast(delta).count(); std::cout << "Runtime=" << runtime_microseconds << " microseconds" << std::endl; + // Creating two 3D matrices of size 2x2x2 for demonstration + ThreeDimensionalMatrix matrix1(2, 2, 2); + ThreeDimensionalMatrix matrix2(2, 2, 2); + + // Initializing matrix1 with some values + matrix1.set_value(0, 0, 0, 1); + matrix1.set_value(0, 0, 1, 2); + matrix1.set_value(0, 1, 0, 3); + matrix1.set_value(0, 1, 1, 4); + matrix1.set_value(1, 0, 0, 5); + matrix1.set_value(1, 0, 1, 6); + matrix1.set_value(1, 1, 0, 7); + matrix1.set_value(1, 1, 1, 8); + + // Initializing matrix2 with some values + matrix2.set_value(0, 0, 0, 8); + matrix2.set_value(0, 0, 1, 7); + matrix2.set_value(0, 1, 0, 6); + matrix2.set_value(0, 1, 1, 5); + matrix2.set_value(1, 0, 0, 4); + matrix2.set_value(1, 0, 1, 3); + matrix2.set_value(1, 1, 0, 2); + matrix2.set_value(1, 1, 1, 1); + + // Performing arithmetic operations + ThreeDimensionalMatrix sumMatrix = matrix1 + matrix2; + ThreeDimensionalMatrix diffMatrix = matrix1 - matrix2; + ThreeDimensionalMatrix prodMatrix = matrix1 * matrix2; + + // Displaying results + std::cout << "Sum of Matrix 1 and Matrix 2:" << std::endl; + // Display sumMatrix + sumMatrix.show(); + + std::cout << "\nDifference between Matrix 1 and Matrix 2:" << std::endl; + // Display diffMatrix + diffMatrix.show(); + + std::cout << "\nProduct of Matrix 1 and Matrix 2:" << std::endl; + // Display prodMatrix + prodMatrix.show(); + return 0; -} \ No newline at end of file +}