Added determinant for matrices of any size
This commit is contained in:
@@ -57,12 +57,26 @@ class BoolSquareMatrix {
|
|||||||
return (_values >> index(row, col)) % 2;
|
return (_values >> index(row, col)) % 2;
|
||||||
}
|
}
|
||||||
STORAGE get_determinant() {
|
STORAGE get_determinant() {
|
||||||
if ( SIZE == 2 ) {
|
if constexpr ( SIZE == 2 ) {
|
||||||
return at(0,0) * at(1,1) - at(0,1) * at(1,0);
|
return at(0,0) * at(1,1) - at(0,1) * at(1,0);
|
||||||
} else if ( SIZE == 3 ) {
|
} else if constexpr ( SIZE == 4 or SIZE == 3 ) {
|
||||||
return at(0,0) * at(1,1) * at(2,2) + at(0,1) * at(1,2) * at(2,0)
|
int cur_modifier = 1;
|
||||||
+ at(0,2) * at(1,0) * at(2,1) - at(0,2) * at(1,1) * at(2,0)
|
STORAGE res = 0;
|
||||||
- at(0,1) * at(1,0) * at(2,2) - at(0,0) * at(1,2) * at(2,1);
|
for (STORAGE remove_ind = 0; remove_ind < SIZE; ++remove_ind) {
|
||||||
|
STORAGE tmp_vector_value = 0;
|
||||||
|
for (STORAGE i = 1; i < SIZE; ++i) {
|
||||||
|
for (STORAGE j = 0; j < SIZE; ++j) {
|
||||||
|
if ( j == remove_ind )
|
||||||
|
continue;
|
||||||
|
tmp_vector_value *= 2;
|
||||||
|
tmp_vector_value += at(i, j);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
BoolSquareMatrix<STORAGE, SIZE - 1> tmp_matix(tmp_vector_value);
|
||||||
|
res += cur_modifier * tmp_matix.get_determinant() * at(0, remove_ind);
|
||||||
|
cur_modifier *= -1;
|
||||||
|
}
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
10
main.cpp
10
main.cpp
@@ -59,6 +59,16 @@ void test_function() {
|
|||||||
assert(minus_i_matrix.string("") == "001010100");
|
assert(minus_i_matrix.string("") == "001010100");
|
||||||
assert(minus_i_matrix.get_determinant() == uint16_t(-1));
|
assert(minus_i_matrix.get_determinant() == uint16_t(-1));
|
||||||
|
|
||||||
|
BoolSquareMatrix<uint16_t, 4> ones_matrix_4(0b1111111111111111),
|
||||||
|
i_matrix_4(0b1000010000100001),
|
||||||
|
minus_i_matrix_4(0b0001001001001000);
|
||||||
|
assert(ones_matrix_4.string("") == "1111111111111111");
|
||||||
|
assert(ones_matrix_4.get_determinant() == 0);
|
||||||
|
assert(i_matrix_4.string("") == "1000010000100001");
|
||||||
|
assert(i_matrix_4.get_determinant() == 1);
|
||||||
|
assert(minus_i_matrix_4.string("") == "0001001001001000");
|
||||||
|
assert(minus_i_matrix_4.get_determinant() == 1);
|
||||||
|
|
||||||
cout << "self-test passed" << endl;
|
cout << "self-test passed" << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user