diff --git a/.cache/clangd/index/Matrix.hpp.B9C1D36F0ACA1714.idx b/.cache/clangd/index/Matrix.hpp.B9C1D36F0ACA1714.idx new file mode 100644 index 0000000..34b906c Binary files /dev/null and b/.cache/clangd/index/Matrix.hpp.B9C1D36F0ACA1714.idx differ diff --git a/.cache/clangd/index/matrix-tests.cpp.88D512D6040A12A3.idx b/.cache/clangd/index/matrix-tests.cpp.88D512D6040A12A3.idx new file mode 100644 index 0000000..f7707e0 Binary files /dev/null and b/.cache/clangd/index/matrix-tests.cpp.88D512D6040A12A3.idx differ diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..6cb6f46 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,33 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Matrix Tests", + "type": "cppdbg", + "request": "launch", + "program": "enter program name, for example ${workspaceFolder}/build/unit-tests/matrix-tests", + "args": [], + "stopAtEntry": false, + "cwd": "${fileDirname}", + "environment": [], + "externalConsole": false, + "MIMode": "gdb", + "setupCommands": [ + { + "description": "Enable pretty-printing for gdb", + "text": "-enable-pretty-printing", + "ignoreFailures": true + }, + { + "description": "Set Disassembly Flavor to Intel", + "text": "-gdb-set disassembly-flavor intel", + "ignoreFailures": true + } + ] + } + + ] +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..8344eb9 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,74 @@ +{ + "C_Cpp.intelliSenseEngine": "default", + "clangd.arguments": [ + "--include-directory=build/unit-tests" + ], + "C_Cpp.default.intelliSenseMode": "linux-gcc-x64", + "files.associations": { + "*.h": "cpp", + "array": "cpp", + "atomic": "cpp", + "bit": "cpp", + "*.tcc": "cpp", + "bitset": "cpp", + "cctype": "cpp", + "chrono": "cpp", + "clocale": "cpp", + "cmath": "cpp", + "compare": "cpp", + "concepts": "cpp", + "condition_variable": "cpp", + "cstdarg": "cpp", + "cstddef": "cpp", + "cstdint": "cpp", + "cstdio": "cpp", + "cstdlib": "cpp", + "cstring": "cpp", + "ctime": "cpp", + "cwchar": "cpp", + "cwctype": "cpp", + "deque": "cpp", + "list": "cpp", + "map": "cpp", + "set": "cpp", + "string": "cpp", + "unordered_map": "cpp", + "vector": "cpp", + "exception": "cpp", + "algorithm": "cpp", + "functional": "cpp", + "iterator": "cpp", + "memory": "cpp", + "memory_resource": "cpp", + "numeric": "cpp", + "optional": "cpp", + "random": "cpp", + "ratio": "cpp", + "regex": "cpp", + "string_view": "cpp", + "system_error": "cpp", + "tuple": "cpp", + "type_traits": "cpp", + "utility": "cpp", + "fstream": "cpp", + "future": "cpp", + "initializer_list": "cpp", + "iomanip": "cpp", + "iosfwd": "cpp", + "iostream": "cpp", + "istream": "cpp", + "limits": "cpp", + "mutex": "cpp", + "new": "cpp", + "numbers": "cpp", + "ostream": "cpp", + "semaphore": "cpp", + "sstream": "cpp", + "stdexcept": "cpp", + "stop_token": "cpp", + "streambuf": "cpp", + "thread": "cpp", + "typeinfo": "cpp", + "variant": "cpp" + } +} \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 6567852..59ec225 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,6 +5,9 @@ add_subdirectory(unit-tests) set(CMAKE_CXX_STANDARD 11) +add_compile_options(-fdiagnostics-color=always) + +# Vector3d add_library(Vector3D STATIC Vector3D.hpp @@ -19,6 +22,7 @@ target_include_directories(Vector3D PUBLIC include ) +# Matrix add_library(Matrix STATIC Matrix.hpp diff --git a/Matrix.hpp b/Matrix.hpp index 3bc9bc5..353b34b 100644 --- a/Matrix.hpp +++ b/Matrix.hpp @@ -10,7 +10,16 @@ template class Matrix { public: Matrix(); - explicit Matrix(const std::array &array); + /** + * @brief Initialize a matrix with an array + */ + Matrix(const std::array &array); + + /** + * @brief Initialize a matrix directly with any number of arguments + */ + // template + // Matrix(Args&&... args); /** * @brief Element-wise matrix addition @@ -101,15 +110,23 @@ public: * @param column the column index of the element * @return The value of the element you want to get */ - float &Get(uint8_t row_index, uint8_t column_index) const; + float Get(uint8_t row_index, uint8_t column_index) const; /** * @brief get the specified row of the matrix returned as a reference to the * internal array */ - std::array &operator[](uint8_t row_index) const; + std::array &operator[](uint8_t row_index){ + return this->matrix[row_index]; + } - Matrix &operator=(const Matrix &other); + Matrix &operator=(const Matrix &other){ + for(uint8_t row_idx{0}; row_idx < rows; row_idx++){ + for(uint8_t column_idx{0}; column_idx < columns; column_idx++){ + this->matrix[row_idx][column_idx] = other.Get(row_idx, column_idx); + } + } + } /** * @brief Get a row from the matrix @@ -170,26 +187,37 @@ template Matrix::Matrix() { } template -Matrix::Matrix(const std::array &array) { +Matrix::Matrix(const std::array &array) { for (uint8_t row_idx{0}; row_idx < rows; row_idx++) { for (uint8_t column_idx{0}; column_idx < columns; column_idx++) { uint16_t array_idx = static_cast(row_idx) + static_cast(column_idx); if (array_idx < array.size()) { - this->Get(row_idx, column_idx) = array[array_idx]; + this->matrix[row_idx][column_idx] = array[array_idx]; } else { - this->Get(row_idx, column_idx) = 0; + this->matrix[row_idx][column_idx] = 0; } } } } +// template +// template +// Matrix::Matrix(Args&&... args){ + +// // Initialize a std::array with the arguments +// std::array values = {args...}; + +// // now call our other constructor which can take this array as an argument +// this = Matrix{values}; +// } + template void Matrix::Add(const Matrix &other, Matrix &result) const { - for (uint8_t row{0}; row < rows; row++) { - for (uint8_t column{0}; column < columns; column++) { - result.Get(row, column) = this->Get(row, column) + other.Get(row, column); + for (uint8_t row_idx{0}; row_idx < rows; row_idx++) { + for (uint8_t column_idx{0}; column_idx < columns; column_idx++) { + result[row_idx][column_idx] = this->Get(row_idx, column_idx) + other.Get(row_idx, column_idx); } } } @@ -197,9 +225,9 @@ void Matrix::Add(const Matrix &other, template void Matrix::Subtract(const Matrix &other, Matrix &result) const { - for (uint8_t row{0}; row < rows; row++) { - for (uint8_t column{0}; column < columns; column++) { - result.Get(row, column) = this->Get(row, column) - other.Get(row, column); + for (uint8_t row_idx{0}; row_idx < rows; row_idx++) { + for (uint8_t column_idx{0}; column_idx < columns; column_idx++) { + result[row_idx][column_idx] = this->Get(row_idx, column_idx) - other.Get(row_idx, column_idx); } } } @@ -222,7 +250,7 @@ void Matrix::Multiply( other_column.Transpose(other_column_t); // the result's index is equal to the dot product of these two vectors - result.Get(row_idx, column_idx) = + result[row_idx][column_idx] = this->dotProduct(this_row, other_column_t); } } @@ -233,7 +261,7 @@ void Matrix::Multiply(float scalar, Matrix &result) const { for (uint8_t row_idx{0}; row_idx < rows; row_idx++) { for (uint8_t column_idx{0}; column_idx < columns; column_idx++) { - result.Get(row_idx, column_idx) = this->Get(row_idx, column_idx) * scalar; + result[row_idx][column_idx] = this->Get(row_idx, column_idx) * scalar; } } } @@ -273,7 +301,7 @@ template void Matrix::Transpose(Matrix &result) const { for (uint8_t column_idx{0}; column_idx < rows; column_idx++) { for (uint8_t row_idx{0}; row_idx < columns; row_idx++) { - result.Get(row_idx, column_idx) = this->Get(column_idx, row_idx); + result[row_idx][column_idx] = this->Get(column_idx, row_idx); } } } @@ -360,7 +388,7 @@ void Matrix::ElementMultiply( const Matrix &other, Matrix &result) const { for (uint8_t row_idx{0}; row_idx < rows; row_idx++) { for (uint8_t column_idx{0}; column_idx < columns; column_idx++) { - result.Get(row_idx, column_idx) = + result[row_idx][column_idx] = this->Get(row_idx, column_idx) * other.Get(row_idx, column_idx); } } @@ -371,14 +399,14 @@ void Matrix::ElementDivide(const Matrix &other, Matrix &result) const { for (uint8_t row_idx{0}; row_idx < rows; row_idx++) { for (uint8_t column_idx{0}; column_idx < columns; column_idx++) { - result.Get(row_idx, column_idx) = + result[row_idx][column_idx] = this->Get(row_idx, column_idx) / other.Get(row_idx, column_idx); } } } template -float &Matrix::Get(uint8_t row_index, +float Matrix::Get(uint8_t row_index, uint8_t column_index) const { return this->matrix[row_index][column_index]; } @@ -393,7 +421,7 @@ template void Matrix::GetColumn(uint8_t column_index, Matrix &column) const { for (uint8_t row_idx{0}; row_idx < rows; row_idx++) { - column.Get(0, column_index) = this->Get(row_idx, column_index); + column[0][column_index] = this->Get(row_idx, column_index); } } @@ -426,7 +454,7 @@ void Matrix::matrixOfMinors( for (uint8_t row_idx{0}; row_idx < rows; row_idx++) { for (uint8_t column_idx{0}; column_idx < columns; column_idx++) { this->minorMatrix(minorMatrix, row_idx, column_idx); - result.Get(row_idx, column_idx) = minorMatrix.Det(); + result[row_idx][column_idx] = minorMatrix.Det(); } } } @@ -457,7 +485,7 @@ void Matrix::adjugate(Matrix &result) const { for (uint8_t column_iter{0}; column_iter < columns; column_iter++) { float sign = ((row_iter + 1) % 2) == 0 ? -1 : 1; sign *= ((column_iter + 1) % 2) == 0 ? -1 : 1; - result.Get(row_iter, column_iter) = + result[row_iter][column_iter] = this->Get(row_iter, column_iter) * sign; } } @@ -480,7 +508,7 @@ void Matrix::normalize(Matrix &result) const { for (uint8_t column_idx{0}; column_idx < rows; column_idx++) { for (uint8_t row_idx{0}; row_idx < columns; row_idx++) { - result.Get(row_idx, column_idx) = this->Get(row_idx, column_idx) / sum; + result[row_idx][column_idx] = this->Get(row_idx, column_idx) / sum; } } } \ No newline at end of file diff --git a/unit-tests/matrix-tests.cpp b/unit-tests/matrix-tests.cpp index d504500..c06a1f6 100644 --- a/unit-tests/matrix-tests.cpp +++ b/unit-tests/matrix-tests.cpp @@ -4,6 +4,9 @@ // include the module you're going to test next #include "Matrix.hpp" +// any other libraries +#include + unsigned int Factorial(unsigned int number) { return number <= 1 ? number : Factorial(number - 1) * number; } @@ -16,8 +19,10 @@ TEST_CASE("Factorials are computed", "[factorial]") { } TEST_CASE("Matrix Addition", "Matrix::Add") { - Matrix<2, 2> mat1{std::array{1, 2, 3, 4}}; - Matrix<2, 2> mat2{std::array{5, 6, 7, 8}}; + std::array arr1{1, 2, 3, 4}; + std::array arr2{5, 6, 7, 8}; + Matrix<2, 2> mat1{arr1}; + Matrix<2, 2> mat2{arr2}; Matrix<2, 2> mat3{}; mat1.Add(mat2, mat3);