41 [[nodiscard]]
bool is_empty()
const override;
42 void zeros()
override;
44 void unify(uword)
override;
47 [[nodiscard]]
T max()
const override;
50 T&
at(uword, uword)
override;
52 [[nodiscard]]
const T*
memptr()
const override;
65 [[nodiscard]]
int sign_det()
const override;
87 using index_t =
typename decltype(
triplet_mat)::index_type;
89 const auto t_idx =
static_cast<index_t
>(idx);
91 suanpan_for(static_cast<index_t>(0),
triplet_mat.
n_elem, [&](
const index_t I) { if(triplet_mat.row(I) == t_idx || triplet_mat.col(I) == t_idx) triplet_mat.val_mem()[I] = 0.; });
99 using index_t =
typename decltype(
triplet_mat)::index_type;
100 return triplet_mat(static_cast<index_t>(in_row), static_cast<index_t>(in_col));
105 using index_t =
typename decltype(
triplet_mat)::index_type;
106 return triplet_mat.
at(static_cast<index_t>(in_row), static_cast<index_t>(in_col));
114 if(
nullptr == in_mat)
return;
116 if(!in_mat->triplet_mat.is_empty())
return this->
operator+=(in_mat->triplet_mat);
118 for(uword I = 0llu; I < in_mat->n_rows; ++I)
for(uword J = 0llu; J < in_mat->n_cols; ++J)
if(
const auto t_val = in_mat->operator()(I, J); !
suanpan::approx_equal(0., t_val))
at(I, J) = t_val;
122 if(
nullptr == in_mat)
return;
124 if(!in_mat->triplet_mat.is_empty())
return this->
operator-=(in_mat->triplet_mat);
126 for(uword I = 0llu; I < in_mat->n_rows; ++I)
for(uword J = 0llu; J < in_mat->n_cols; ++J)
if(
const auto t_val = in_mat->operator()(I, J); !
suanpan::approx_equal(0., t_val))
at(I, J) = -t_val;
std::enable_if_t<!std::numeric_limits< T >::is_integer, bool > approx_equal(T x, T y, int ulp=2)
Definition: utility.h:46
void suanpan_for(const IT start, const IT end, F &&FN)
Definition: utility.h:24
A SparseMat class that holds matrices.
Definition: SparseMat.hpp:34