Started adding the first real unit test

This commit is contained in:
Quinn Henthorne
2024-12-10 17:06:07 -05:00
parent 1ef741ea93
commit 3233263ffc
2 changed files with 26 additions and 13 deletions

View File

@@ -6,12 +6,11 @@
#include <cstdlib> #include <cstdlib>
#include <type_traits> #include <type_traits>
template <uint8_t rows, uint8_t columns> class Matrix { template <uint8_t rows, uint8_t columns> class Matrix {
public: public:
Matrix(); Matrix();
Matrix(const std::array<float, columns> &array); explicit Matrix(const std::array<float, columns> &array);
/** /**
* @brief Element-wise matrix addition * @brief Element-wise matrix addition
@@ -76,7 +75,7 @@ public:
* @brief Calculate the eigenvalues for a square matrix * @brief Calculate the eigenvalues for a square matrix
* @param result a buffer to store the result into * @param result a buffer to store the result into
*/ */
void EigenValues(Matrix<rows, 1> &result) const; void EigenValues(Matrix<rows, 1> &eigenvalues) const;
/** /**
* @brief Element-wise multiply the two matrices * @brief Element-wise multiply the two matrices
@@ -110,7 +109,7 @@ public:
*/ */
std::array<float, columns> &operator[](uint8_t row_index) const; std::array<float, columns> &operator[](uint8_t row_index) const;
void operator=(Matrix<rows, columns> &other); Matrix<rows, columns> &operator=(const Matrix<rows, columns> &other);
/** /**
* @brief Get a row from the matrix * @brief Get a row from the matrix
@@ -174,10 +173,10 @@ template <uint8_t rows, uint8_t columns>
Matrix<rows, columns>::Matrix(const std::array<float, columns> &array) { Matrix<rows, columns>::Matrix(const std::array<float, columns> &array) {
for (uint8_t row_idx{0}; row_idx < rows; row_idx++) { for (uint8_t row_idx{0}; row_idx < rows; row_idx++) {
for (uint8_t column_idx{0}; column_idx < columns; column_idx++) { for (uint8_t column_idx{0}; column_idx < columns; column_idx++) {
uint16_t i = uint16_t array_idx =
static_cast<uint16_t>(row_idx) + static_cast<uint16_t>(column_idx); static_cast<uint16_t>(row_idx) + static_cast<uint16_t>(column_idx);
if (i < array.size()) { if (array_idx < array.size()) {
this->Get(row_idx, column_idx) = array[i]; this->Get(row_idx, column_idx) = array[array_idx];
} else { } else {
this->Get(row_idx, column_idx) = 0; this->Get(row_idx, column_idx) = 0;
} }
@@ -311,7 +310,8 @@ void Matrix<rows, columns>::EigenValues(Matrix<rows, 1> &eigenvalues) const {
Matrix<rows, 1> Av{}; Matrix<rows, 1> Av{};
Matrix<rows, 1> z{}; Matrix<rows, 1> z{};
float d = 0.0, d_old = 0.0; float d = 0.0;
float d_old = 0.0;
constexpr float convergence_value{1e-6}; constexpr float convergence_value{1e-6};
constexpr uint16_t max_iterations{500}; constexpr uint16_t max_iterations{500};
@@ -344,7 +344,7 @@ void Matrix<rows, columns>::EigenValues(Matrix<rows, 1> &eigenvalues) const {
} }
/* Check for convergence */ /* Check for convergence */
if (fabs(d - d_old) < convergence_value) { if (std::fabs(d - d_old) < convergence_value) {
eigenvalues[0][k] = d; eigenvalues[0][k] = d;
k++; k++;
d = 0.0; d = 0.0;
@@ -439,12 +439,12 @@ void Matrix<rows, columns>::minorMatrix(Matrix<rows - 1, columns - 1> &result,
for (uint8_t row_iter{0}; row_iter < rows; row_iter++) { for (uint8_t row_iter{0}; row_iter < rows; row_iter++) {
for (uint8_t column_iter{0}; column_iter < columns; column_iter++) { for (uint8_t column_iter{0}; column_iter < columns; column_iter++) {
uint16_t i = uint16_t array_idx =
static_cast<uint16_t>(row_iter) + static_cast<uint16_t>(column_iter); static_cast<uint16_t>(row_iter) + static_cast<uint16_t>(column_iter);
if (row_iter == row_idx || column_iter == column_idx) { if (row_iter == row_idx || column_iter == column_idx) {
continue; continue;
} }
subArray[i] = this->Get(row_iter, column_iter); subArray[array_idx] = this->Get(row_iter, column_iter);
} }
} }
@@ -455,8 +455,8 @@ template <uint8_t rows, uint8_t columns>
void Matrix<rows, columns>::adjugate(Matrix<rows, columns> &result) const { void Matrix<rows, columns>::adjugate(Matrix<rows, columns> &result) const {
for (uint8_t row_iter{0}; row_iter < rows; row_iter++) { for (uint8_t row_iter{0}; row_iter < rows; row_iter++) {
for (uint8_t column_iter{0}; column_iter < columns; column_iter++) { for (uint8_t column_iter{0}; column_iter < columns; column_iter++) {
float sign = ((row_iter + 1) % 2) ? -1 : 1; float sign = ((row_iter + 1) % 2) == 0 ? -1 : 1;
sign *= ((column_iter + 1) % 2) ? -1 : 1; sign *= ((column_iter + 1) % 2) == 0 ? -1 : 1;
result.Get(row_iter, column_iter) = result.Get(row_iter, column_iter) =
this->Get(row_iter, column_iter) * sign; this->Get(row_iter, column_iter) * sign;
} }

View File

@@ -13,4 +13,17 @@ TEST_CASE("Factorials are computed", "[factorial]") {
REQUIRE(Factorial(2) == 2); REQUIRE(Factorial(2) == 2);
REQUIRE(Factorial(3) == 6); REQUIRE(Factorial(3) == 6);
REQUIRE(Factorial(10) == 3628800); REQUIRE(Factorial(10) == 3628800);
}
TEST_CASE("Matrix Addition", "Matrix::Add") {
Matrix<2, 2> mat1{std::array<float, 4>{1, 2, 3, 4}};
Matrix<2, 2> mat2{std::array<float, 4>{5, 6, 7, 8}};
Matrix<2, 2> mat3{};
mat1.Add(mat2, mat3);
REQUIRE(mat3.Get(0, 0) == 6);
REQUIRE(mat3.Get(0, 1) == 8);
REQUIRE(mat3.Get(1, 0) == 10);
REQUIRE(mat3.Get(1, 1) == 12);
} }