mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-04-19 08:09:36 +08:00
Fix sparse matrix times sparse vector.
This commit is contained in:
parent
85c7659574
commit
fbb53b6cbb
@ -28,6 +28,8 @@ static void conservative_sparse_sparse_product_impl(const Lhs& lhs, const Rhs& r
|
|||||||
ei_declare_aligned_stack_constructed_variable(bool, mask, rows, 0);
|
ei_declare_aligned_stack_constructed_variable(bool, mask, rows, 0);
|
||||||
ei_declare_aligned_stack_constructed_variable(Scalar, values, rows, 0);
|
ei_declare_aligned_stack_constructed_variable(Scalar, values, rows, 0);
|
||||||
ei_declare_aligned_stack_constructed_variable(Index, indices, rows, 0);
|
ei_declare_aligned_stack_constructed_variable(Index, indices, rows, 0);
|
||||||
|
|
||||||
|
std::memset(mask,0,sizeof(bool)*rows);
|
||||||
|
|
||||||
// estimate the number of non zero entries
|
// estimate the number of non zero entries
|
||||||
// given a rhs column containing Y non zeros, we assume that the respective Y columns
|
// given a rhs column containing Y non zeros, we assume that the respective Y columns
|
||||||
@ -155,14 +157,14 @@ struct conservative_sparse_sparse_product_selector<Lhs,Rhs,ResultType,ColMajor,C
|
|||||||
{
|
{
|
||||||
// perform sorted insertion
|
// perform sorted insertion
|
||||||
internal::conservative_sparse_sparse_product_impl<Lhs,Rhs,ColMajorMatrix>(lhs, rhs, resCol, true);
|
internal::conservative_sparse_sparse_product_impl<Lhs,Rhs,ColMajorMatrix>(lhs, rhs, resCol, true);
|
||||||
res.swap(resCol);
|
res = resCol.markAsRValue();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// ressort to transpose to sort the entries
|
// ressort to transpose to sort the entries
|
||||||
internal::conservative_sparse_sparse_product_impl<Lhs,Rhs,ColMajorMatrix>(lhs, rhs, resCol, false);
|
internal::conservative_sparse_sparse_product_impl<Lhs,Rhs,ColMajorMatrix>(lhs, rhs, resCol, false);
|
||||||
RowMajorMatrix resRow(resCol);
|
RowMajorMatrix resRow(resCol);
|
||||||
res = resRow;
|
res = resRow.markAsRValue();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -71,6 +71,7 @@ template<typename Scalar,typename Index> void sparse_vector(int rows, int cols)
|
|||||||
VERIFY_IS_APPROX(v1.dot(v2), refV1.dot(refV2));
|
VERIFY_IS_APPROX(v1.dot(v2), refV1.dot(refV2));
|
||||||
VERIFY_IS_APPROX(v1.dot(refV2), refV1.dot(refV2));
|
VERIFY_IS_APPROX(v1.dot(refV2), refV1.dot(refV2));
|
||||||
|
|
||||||
|
VERIFY_IS_APPROX(m1*v2, refM1*refV2);
|
||||||
VERIFY_IS_APPROX(v1.dot(m1*v2), refV1.dot(refM1*refV2));
|
VERIFY_IS_APPROX(v1.dot(m1*v2), refV1.dot(refM1*refV2));
|
||||||
int i = internal::random<int>(0,rows-1);
|
int i = internal::random<int>(0,rows-1);
|
||||||
VERIFY_IS_APPROX(v1.dot(m1.col(i)), refV1.dot(refM1.col(i)));
|
VERIFY_IS_APPROX(v1.dot(m1.col(i)), refV1.dot(refM1.col(i)));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user