Got rid of zeroBelowDiagonal, as Eigen has it, and was used in only a single place

release/4.3a0
Frank Dellaert 2025-02-19 23:38:19 -05:00
parent fa37ce710d
commit c87050bc8b
3 changed files with 2 additions and 70 deletions

View File

@ -639,7 +639,7 @@ void inplace_QR(Matrix& A){
Eigen::internal::householder_qr_inplace_blocked<Matrix, HCoeffsType>::run(A, hCoeffs, 48, temp.data()); Eigen::internal::householder_qr_inplace_blocked<Matrix, HCoeffsType>::run(A, hCoeffs, 48, temp.data());
#endif #endif
zeroBelowDiagonal(A); A.triangularView<Eigen::StrictlyLower>().setZero();
} }
} // namespace gtsam } // namespace gtsam

View File

@ -216,19 +216,6 @@ const typename MATRIX::ConstRowXpr row(const MATRIX& A, size_t j) {
return A.row(j); return A.row(j);
} }
/**
* Zeros all of the elements below the diagonal of a matrix, in place
* @param A is a matrix, to be modified in place
* @param cols is the number of columns to zero, use zero for all columns
*/
template<class MATRIX>
void zeroBelowDiagonal(MATRIX& A, size_t cols=0) {
const size_t m = A.rows(), n = A.cols();
const size_t k = (cols) ? std::min(cols, std::min(m,n)) : std::min(m,n);
for (size_t j=0; j<k; ++j)
A.col(j).segment(j+1, m-(j+1)).setZero();
}
/** /**
* static transpose function, just calls Eigen transpose member function * static transpose function, just calls Eigen transpose member function
*/ */

View File

@ -596,61 +596,6 @@ TEST(Matrix, scalar_divide )
EQUALITY(B,A/10); EQUALITY(B,A/10);
} }
/* ************************************************************************* */
TEST(Matrix, zero_below_diagonal ) {
Matrix A1 = (Matrix(3, 4) <<
1.0, 2.0, 3.0, 4.0,
1.0, 2.0, 3.0, 4.0,
1.0, 2.0, 3.0, 4.0).finished();
Matrix expected1 = (Matrix(3, 4) <<
1.0, 2.0, 3.0, 4.0,
0.0, 2.0, 3.0, 4.0,
0.0, 0.0, 3.0, 4.0).finished();
Matrix actual1r = A1;
zeroBelowDiagonal(actual1r);
EXPECT(assert_equal(expected1, actual1r, 1e-10));
Matrix actual1c = A1;
zeroBelowDiagonal(actual1c);
EXPECT(assert_equal(Matrix(expected1), actual1c, 1e-10));
actual1c = A1;
zeroBelowDiagonal(actual1c, 4);
EXPECT(assert_equal(Matrix(expected1), actual1c, 1e-10));
Matrix A2 = (Matrix(5, 3) <<
1.0, 2.0, 3.0,
1.0, 2.0, 3.0,
1.0, 2.0, 3.0,
1.0, 2.0, 3.0,
1.0, 2.0, 3.0).finished();
Matrix expected2 = (Matrix(5, 3) <<
1.0, 2.0, 3.0,
0.0, 2.0, 3.0,
0.0, 0.0, 3.0,
0.0, 0.0, 0.0,
0.0, 0.0, 0.0).finished();
Matrix actual2r = A2;
zeroBelowDiagonal(actual2r);
EXPECT(assert_equal(expected2, actual2r, 1e-10));
Matrix actual2c = A2;
zeroBelowDiagonal(actual2c);
EXPECT(assert_equal(Matrix(expected2), actual2c, 1e-10));
Matrix expected2_partial = (Matrix(5, 3) <<
1.0, 2.0, 3.0,
0.0, 2.0, 3.0,
0.0, 2.0, 3.0,
0.0, 2.0, 3.0,
0.0, 2.0, 3.0).finished();
actual2c = A2;
zeroBelowDiagonal(actual2c, 1);
EXPECT(assert_equal(Matrix(expected2_partial), actual2c, 1e-10));
}
/* ************************************************************************* */ /* ************************************************************************* */
TEST(Matrix, inverse ) TEST(Matrix, inverse )
{ {
@ -825,7 +770,7 @@ TEST(Matrix, eigen_QR )
10, 0, 0, 0,-10,0, 2, 10, 0, 0, 0,-10,0, 2,
00, 10,0, 0, 0, -10, -1).finished()); 00, 10,0, 0, 0, -10, -1).finished());
Matrix actual = A.householderQr().matrixQR(); Matrix actual = A.householderQr().matrixQR();
zeroBelowDiagonal(actual); actual.triangularView<Eigen::StrictlyLower>().setZero();
EXPECT(assert_equal(expected, actual, 1e-3)); EXPECT(assert_equal(expected, actual, 1e-3));