10 #ifndef EIGEN_SPARSE_SELFADJOINTVIEW_H 11 #define EIGEN_SPARSE_SELFADJOINTVIEW_H 29 template<
typename Lhs,
typename Rhs,
int UpLo>
32 template<
typename Lhs,
typename Rhs,
int UpLo>
37 template<
typename MatrixType,
unsigned int UpLo>
41 template<
int SrcUpLo,
int DstUpLo,
typename MatrixType,
int DestOrder>
44 template<
int UpLo,
typename MatrixType,
int DestOrder>
50 :
public EigenBase<SparseSelfAdjointView<MatrixType,UpLo> >
55 typedef typename MatrixType::Index Index;
57 typedef typename MatrixType::Nested MatrixTypeNested;
62 eigen_assert(rows()==cols() &&
"SelfAdjointView is only for squared matrices");
65 inline Index rows()
const {
return m_matrix.rows(); }
66 inline Index cols()
const {
return m_matrix.cols(); }
69 const _MatrixTypeNested& matrix()
const {
return m_matrix; }
70 _MatrixTypeNested& matrix() {
return m_matrix.const_cast_derived(); }
77 template<
typename OtherDerived>
89 template<
typename OtherDerived>
friend 97 template<
typename OtherDerived>
105 template<
typename OtherDerived>
friend 120 template<
typename DerivedU>
126 internal::permute_symm_to_fullsymm<UpLo>(m_matrix, _dest);
133 internal::permute_symm_to_fullsymm<UpLo>(m_matrix, tmp);
143 template<
typename SrcMatrixType,
int SrcUpLo>
146 permutedMatrix.evalTo(*
this);
157 template<
typename SrcMatrixType,
unsigned int SrcUpLo>
170 typename MatrixType::Nested m_matrix;
171 mutable VectorI m_countPerRow;
172 mutable VectorI m_countPerCol;
179 template<
typename Derived>
180 template<
unsigned int UpLo>
186 template<
typename Derived>
187 template<
unsigned int UpLo>
197 template<
typename MatrixType,
unsigned int UpLo>
198 template<
typename DerivedU>
204 m_matrix.const_cast_derived() = tmp.template triangularView<UpLo>();
206 m_matrix.const_cast_derived() += alpha * tmp.template triangularView<UpLo>();
216 template<
typename Lhs,
typename Rhs,
int UpLo>
218 :
traits<ProductBase<SparseSelfAdjointTimeDenseProduct<Lhs,Rhs,UpLo>, Lhs, Rhs> >
224 template<
typename Lhs,
typename Rhs,
int UpLo>
226 :
public ProductBase<SparseSelfAdjointTimeDenseProduct<Lhs,Rhs,UpLo>, Lhs, Rhs>
234 template<
typename Dest>
void scaleAndAddTo(Dest& dest,
const Scalar& alpha)
const 236 EIGEN_ONLY_USED_FOR_DEBUG(alpha);
238 eigen_assert(alpha==
Scalar(1) &&
"alpha != 1 is not implemented yet, sorry");
240 typedef typename _Lhs::InnerIterator LhsInnerIterator;
245 || ( (UpLo&
Upper) && !LhsIsRowMajor)
246 || ( (UpLo&
Lower) && LhsIsRowMajor),
247 ProcessSecondHalf = !ProcessFirstHalf
249 for (Index j=0; j<m_lhs.outerSize(); ++j)
251 LhsInnerIterator i(m_lhs,j);
252 if (ProcessSecondHalf)
254 while (i && i.index()<j) ++i;
255 if(i && i.index()==j)
257 dest.row(j) += i.value() * m_rhs.row(j);
261 for(; (ProcessFirstHalf ? i && i.index() < j : i) ; ++i)
263 Index a = LhsIsRowMajor ? j : i.index();
264 Index b = LhsIsRowMajor ? i.index() : j;
266 dest.row(a) += (v) * m_rhs.row(b);
267 dest.row(b) += numext::conj(v) * m_rhs.row(a);
269 if (ProcessFirstHalf && i && (i.index()==j))
270 dest.row(j) += i.value() * m_rhs.row(j);
279 template<
typename Lhs,
typename Rhs,
int UpLo>
281 :
traits<ProductBase<DenseTimeSparseSelfAdjointProduct<Lhs,Rhs,UpLo>, Lhs, Rhs> >
285 template<
typename Lhs,
typename Rhs,
int UpLo>
287 :
public ProductBase<DenseTimeSparseSelfAdjointProduct<Lhs,Rhs,UpLo>, Lhs, Rhs>
295 template<
typename Dest>
void scaleAndAddTo(Dest& ,
const Scalar& )
const 309 template<
typename MatrixType,
int UpLo>
313 template<
int UpLo,
typename MatrixType,
int DestOrder>
316 typedef typename MatrixType::Index Index;
321 Dest& dest(_dest.derived());
323 StorageOrderMatch = int(Dest::IsRowMajor) == int(MatrixType::IsRowMajor)
326 Index
size = mat.rows();
330 dest.resize(size,size);
331 for(Index j = 0; j<
size; ++j)
333 Index jp = perm ? perm[j] : j;
334 for(
typename MatrixType::InnerIterator it(mat,j); it; ++it)
336 Index i = it.index();
339 Index ip = perm ? perm[i] : i;
341 count[StorageOrderMatch ? jp : ip]++;
344 else if(( UpLo==
Lower && r>c) || ( UpLo==
Upper && r<c))
351 Index nnz = count.sum();
354 dest.resizeNonZeros(nnz);
355 dest.outerIndexPtr()[0] = 0;
356 for(Index j=0; j<
size; ++j)
357 dest.outerIndexPtr()[j+1] = dest.outerIndexPtr()[j] + count[j];
358 for(Index j=0; j<
size; ++j)
359 count[j] = dest.outerIndexPtr()[j];
362 for(Index j = 0; j<
size; ++j)
364 for(
typename MatrixType::InnerIterator it(mat,j); it; ++it)
366 Index i = it.index();
370 Index jp = perm ? perm[j] : j;
371 Index ip = perm ? perm[i] : i;
375 Index k = count[StorageOrderMatch ? jp : ip]++;
376 dest.innerIndexPtr()[k] = StorageOrderMatch ? ip : jp;
377 dest.valuePtr()[k] = it.value();
381 Index k = count[ip]++;
382 dest.innerIndexPtr()[k] = ip;
383 dest.valuePtr()[k] = it.value();
385 else if(( (UpLo&
Lower)==Lower && r>c) || ( (UpLo&
Upper)==Upper && r<c))
387 if(!StorageOrderMatch)
389 Index k = count[jp]++;
390 dest.innerIndexPtr()[k] = ip;
391 dest.valuePtr()[k] = it.value();
393 dest.innerIndexPtr()[k] = jp;
394 dest.valuePtr()[k] = numext::conj(it.value());
400 template<
int _SrcUpLo,
int _DstUpLo,
typename MatrixType,
int DstOrder>
403 typedef typename MatrixType::Index Index;
409 StorageOrderMatch = int(SrcOrder) == int(DstOrder),
414 Index
size = mat.rows();
417 dest.resize(size,size);
418 for(Index j = 0; j<
size; ++j)
420 Index jp = perm ? perm[j] : j;
421 for(
typename MatrixType::InnerIterator it(mat,j); it; ++it)
423 Index i = it.index();
424 if((
int(SrcUpLo)==
int(
Lower) && i<j) || (
int(SrcUpLo)==
int(
Upper) && i>j))
427 Index ip = perm ? perm[i] : i;
428 count[int(DstUpLo)==int(
Lower) ? (std::min)(ip,jp) : (std::max)(ip,jp)]++;
431 dest.outerIndexPtr()[0] = 0;
432 for(Index j=0; j<
size; ++j)
433 dest.outerIndexPtr()[j+1] = dest.outerIndexPtr()[j] + count[j];
434 dest.resizeNonZeros(dest.outerIndexPtr()[
size]);
435 for(Index j=0; j<
size; ++j)
436 count[j] = dest.outerIndexPtr()[j];
438 for(Index j = 0; j<
size; ++j)
441 for(
typename MatrixType::InnerIterator it(mat,j); it; ++it)
443 Index i = it.index();
444 if((
int(SrcUpLo)==
int(
Lower) && i<j) || (
int(SrcUpLo)==
int(
Upper) && i>j))
447 Index jp = perm ? perm[j] : j;
448 Index ip = perm? perm[i] : i;
450 Index k = count[int(DstUpLo)==int(
Lower) ? (std::min)(ip,jp) : (std::max)(ip,jp)]++;
451 dest.innerIndexPtr()[k] = int(DstUpLo)==int(
Lower) ? (std::max)(ip,jp) : (std::min)(ip,jp);
453 if(!StorageOrderMatch) std::swap(ip,jp);
454 if( ((
int(DstUpLo)==
int(
Lower) && ip<jp) || (
int(DstUpLo)==
int(
Upper) && ip>jp)))
455 dest.valuePtr()[k] = numext::conj(it.value());
457 dest.valuePtr()[k] = it.value();
464 template<
typename MatrixType,
int UpLo>
466 :
public EigenBase<SparseSymmetricPermutationProduct<MatrixType,UpLo> >
470 typedef typename MatrixType::Index Index;
475 typedef typename MatrixType::Nested MatrixTypeNested;
479 : m_matrix(mat), m_perm(perm)
482 inline Index rows()
const {
return m_matrix.rows(); }
483 inline Index cols()
const {
return m_matrix.cols(); }
485 template<
typename DestScalar,
int Options,
typename DstIndex>
490 internal::permute_symm_to_fullsymm<UpLo>(m_matrix,tmp,m_perm.indices().data());
496 internal::permute_symm_to_symm<UpLo,DestUpLo>(m_matrix,dest.matrix(),m_perm.indices().data());
500 MatrixTypeNested m_matrix;
507 #endif // EIGEN_SPARSE_SELFADJOINTVIEW_H Definition: gtest_unittest.cc:5031
Definition: SparseProduct.h:80
A versatible sparse matrix representation.
Definition: SparseMatrix.h:85
Definition: SparseSelfAdjointView.h:465
Definition: ProductBase.h:63
Definition: SparseSelfAdjointView.h:33
iterative scaling algorithm to equilibrate rows and column norms in matrices
Definition: TestIMU_Common.h:87
Pseudo expression to manipulate a triangular sparse matrix as a selfadjoint matrix.
Definition: SparseSelfAdjointView.h:49
const unsigned int RowMajorBit
for a matrix, this means that the storage order is row-major.
Definition: Constants.h:53
Definition: SparseSelfAdjointView.h:30
Common base class for all classes T such that MatrixBase has an operator=(T) and a constructor Matrix...
Definition: EigenBase.h:26
detail::size< coerce_list< Ts... >> size
Get the size of a list (number of elements.)
Definition: Size.h:56
friend DenseTimeSparseSelfAdjointProduct< OtherDerived, MatrixType, UpLo > operator*(const MatrixBase< OtherDerived > &lhs, const SparseSelfAdjointView &rhs)
Efficient dense vector/matrix times sparse self-adjoint matrix product.
Definition: SparseSelfAdjointView.h:107
View matrix as an upper triangular matrix.
Definition: Constants.h:169
Base class of any sparse matrices or sparse expressions.
Definition: ForwardDeclarations.h:239
Storage order is column major (see TopicStorageOrders).
Definition: Constants.h:264
SparseSelfAdjointView & rankUpdate(const SparseMatrixBase< DerivedU > &u, const Scalar &alpha=Scalar(1))
Perform a symmetric rank K update of the selfadjoint matrix *this: where u is a vector or matrix...
A sparse matrix class designed for matrix assembly purpose.
Definition: SparseUtil.h:71
SparseSymmetricPermutationProduct< _MatrixTypeNested, UpLo > twistedBy(const PermutationMatrix< Dynamic, Dynamic, Index > &perm) const
Definition: SparseSelfAdjointView.h:138
SparseSelfAdjointTimeDenseProduct< MatrixType, OtherDerived, UpLo > operator*(const MatrixBase< OtherDerived > &rhs) const
Efficient sparse self-adjoint matrix times dense vector/matrix product.
Definition: SparseSelfAdjointView.h:99
Definition: BandTriangularSolver.h:13
Storage order is row major (see TopicStorageOrders).
Definition: Constants.h:266
friend SparseSparseProduct< OtherDerived, typename OtherDerived::PlainObject > operator*(const SparseMatrixBase< OtherDerived > &lhs, const SparseSelfAdjointView &rhs)
Definition: SparseSelfAdjointView.h:91
View matrix as a lower triangular matrix.
Definition: Constants.h:167
The type used to identify a dense storage.
Definition: Constants.h:428
Base class for all dense matrices, vectors, and expressions.
Definition: MatrixBase.h:48
Definition: ForwardDeclarations.h:17
double Scalar
Common scalar type.
Definition: FlexibleKalmanBase.h:48
SparseSparseProduct< typename OtherDerived::PlainObject, OtherDerived > operator*(const SparseMatrixBase< OtherDerived > &rhs) const
Definition: SparseSelfAdjointView.h:79