Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ > Class Template Reference

A versatile sparse matrix representation where each element is a block. More...

#include <BlockSparseMatrix.h>

+ Inheritance diagram for Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >:

Classes

class  BlockInnerIterator
 
class  InnerIterator
 

Public Types

enum  {
  Options = Options_ , Flags = Options , BlockSize = _BlockAtCompileTime , RowsAtCompileTime = Dynamic ,
  ColsAtCompileTime = Dynamic , MaxRowsAtCompileTime = Dynamic , MaxColsAtCompileTime = Dynamic , IsVectorAtCompileTime = 0 ,
  IsColMajor = Flags & RowMajorBit ? 0 : 1
}
 
typedef Scalar_ Scalar
 
typedef NumTraits< Scalar >::Real RealScalar
 
typedef StorageIndex_ StorageIndex
 
typedef internal::ref_selector< BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ > >::type Nested
 
typedef Matrix< Scalar, _BlockAtCompileTime, _BlockAtCompileTime, IsColMajor ? ColMajor :RowMajorBlockScalar
 
typedef Matrix< RealScalar, _BlockAtCompileTime, _BlockAtCompileTime, IsColMajor ? ColMajor :RowMajorBlockRealScalar
 
typedef std::conditional_t< _BlockAtCompileTime==Dynamic, Scalar, BlockScalarBlockScalarReturnType
 
typedef BlockSparseMatrix< Scalar, BlockSize, IsColMajor ? ColMajor :RowMajor, StorageIndexPlainObject
 
- Public Types inherited from Eigen::SparseMatrixBase< BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ > >
enum  
 
typedef internal::traits< BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ > >::Scalar Scalar
 
typedef Scalar value_type
 
typedef internal::packet_traits< Scalar >::type PacketScalar
 
typedef internal::traits< BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ > >::StorageKind StorageKind
 
typedef internal::traits< BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ > >::StorageIndex StorageIndex
 
typedef internal::add_const_on_value_type_if_arithmetic< typename internal::packet_traits< Scalar >::type >::type PacketReturnType
 
typedef SparseMatrixBase StorageBaseType
 
typedef Matrix< StorageIndex, Dynamic, 1 > IndexVector
 
typedef Matrix< Scalar, Dynamic, 1 > ScalarVector
 
typedef std::conditional_t< NumTraits< Scalar >::IsComplex, CwiseUnaryOp< internal::scalar_conjugate_op< Scalar >, Eigen::Transpose< const BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ > > >, Transpose< const BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ > > > AdjointReturnType
 
typedef Transpose< BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ > > TransposeReturnType
 
typedef Transpose< const BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ > > ConstTransposeReturnType
 
typedef SparseMatrix< Scalar, Flags &RowMajorBit ? RowMajor :ColMajor, StorageIndexPlainObject
 
typedef NumTraits< Scalar >::Real RealScalar
 
typedef std::conditional_t< HasDirectAccess_, const Scalar &, ScalarCoeffReturnType
 
typedef CwiseNullaryOp< internal::scalar_constant_op< Scalar >, Matrix< Scalar, Dynamic, Dynamic > > ConstantReturnType
 
typedef Matrix< Scalar, RowsAtCompileTime, ColsAtCompileTimeDenseMatrixType
 
typedef Matrix< Scalar, internal::max_size_prefer_dynamic(RowsAtCompileTime, ColsAtCompileTime), internal::max_size_prefer_dynamic(RowsAtCompileTime, ColsAtCompileTime)> SquareMatrixType
 
typedef EigenBase< BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ > > Base
 
- Public Types inherited from Eigen::EigenBase< BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ > >
typedef Eigen::Index Index
 The interface type of indices. More...
 
typedef internal::traits< BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ > >::StorageKind StorageKind
 

Public Member Functions

 BlockSparseMatrix ()
 
 BlockSparseMatrix (Index brow, Index bcol)
 Construct and resize. More...
 
 BlockSparseMatrix (const BlockSparseMatrix &other)
 Copy-constructor. More...
 
BlockSparseMatrixoperator= (BlockSparseMatrix other)
 
 ~BlockSparseMatrix ()
 
template<typename MatrixType >
 BlockSparseMatrix (const MatrixType &spmat)
 Constructor from a sparse matrix. More...
 
template<typename MatrixType >
BlockSparseMatrixoperator= (const MatrixType &spmat)
 Assignment from a sparse matrix with the same storage order. More...
 
template<typename MatrixType >
void setBlockStructure (const MatrixType &blockPattern)
 Set the nonzero block pattern of the matrix. More...
 
void resize (Index brow, Index bcol)
 Set the number of rows and columns blocks. More...
 
void setBlockSize (Index blockSize)
 set the block size at runtime for fixed-size block layout More...
 
void setBlockLayout (const VectorXi &rowBlocks, const VectorXi &colBlocks)
 Set the row and column block layouts,. More...
 
void reserve (const Index nonzerosblocks)
 Allocate the internal array of pointers to blocks and their inner indices. More...
 
template<typename InputIterator >
void setFromTriplets (const InputIterator &begin, const InputIterator &end)
 Fill values in a matrix from a triplet list. More...
 
Index rows () const
 
Index cols () const
 
Index innerSize () const
 
Index outerSize () const
 
Index blockRows () const
 
Index blockCols () const
 
Index outerBlocks () const
 
Index innerBlocks () const
 
Index outerToBlock (Index outer) const
 
Index innerToBlock (Index inner) const
 
Ref< BlockScalarcoeffRef (Index brow, Index bcol)
 
Map< const BlockScalarcoeff (Index brow, Index bcol) const
 
template<typename VecType >
BlockSparseTimeDenseProduct< BlockSparseMatrix, VecType > operator* (const VecType &lhs) const
 
Index nonZerosBlocks () const
 
Index nonZeros () const
 
BlockScalarReturnTypevaluePtr ()
 
StorageIndexinnerIndexPtr ()
 
const StorageIndexinnerIndexPtr () const
 
StorageIndexouterIndexPtr ()
 
const StorageIndexouterIndexPtr () const
 
bool isCompressed () const
 for compatibility purposes with the SparseMatrix class More...
 
Index blockRowsIndex (Index bi) const
 
Index blockColsIndex (Index bj) const
 
Index blockOuterIndex (Index bj) const
 
Index blockInnerIndex (Index bi) const
 
Index blockInnerSize (Index bi) const
 
Index blockOuterSize (Index bj) const
 
Index blockPtr (Index id) const
 
- Public Member Functions inherited from Eigen::SparseMatrixBase< BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ > >
BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ > & operator= (const EigenBase< OtherDerived > &other)
 
BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ > & operator= (const ReturnByValue< OtherDerived > &other)
 
BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ > & operator= (const SparseMatrixBase< OtherDerived > &other)
 
BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ > & operator= (const BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ > &other)
 
const BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ > & derived () const
 
BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ > & derived ()
 
BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ > & const_cast_derived () const
 
Index rows () const
 
Index cols () const
 
Index size () const
 
bool isVector () const
 
Index outerSize () const
 
Index innerSize () const
 
bool isRValue () const
 
BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ > & markAsRValue ()
 
 SparseMatrixBase ()
 
BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ > & operator+= (const SparseMatrixBase< OtherDerived > &other)
 
BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ > & operator+= (const DiagonalBase< OtherDerived > &other)
 
BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ > & operator+= (const EigenBase< OtherDerived > &other)
 
EIGEN_STRONG_INLINE BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ > & operator+= (const SparseMatrixBase< OtherDerived > &other)
 
BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ > & operator-= (const SparseMatrixBase< OtherDerived > &other)
 
BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ > & operator-= (const DiagonalBase< OtherDerived > &other)
 
BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ > & operator-= (const EigenBase< OtherDerived > &other)
 
EIGEN_STRONG_INLINE BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ > & operator-= (const SparseMatrixBase< OtherDerived > &other)
 
BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ > & operator*= (const Scalar &other)
 
BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ > & operator*= (const SparseMatrixBase< OtherDerived > &other)
 
BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ > & operator/= (const Scalar &other)
 
EIGEN_STRONG_INLINE const CwiseProductDenseReturnType< OtherDerived >::Type cwiseProduct (const MatrixBase< OtherDerived > &other) const
 
EIGEN_STRONG_INLINE const SparseMatrixBase< BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ > >::template CwiseProductDenseReturnType< OtherDerived >::Type cwiseProduct (const MatrixBase< OtherDerived > &other) const
 
const Product< BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >, OtherDerived > operator* (const DiagonalBase< OtherDerived > &other) const
 
const Product< BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >, OtherDerived, AliasFreeProduct > operator* (const SparseMatrixBase< OtherDerived > &other) const
 
const Product< BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >, OtherDerived > operator* (const MatrixBase< OtherDerived > &other) const
 
SparseSymmetricPermutationProduct< BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >, Upper|Lower > twistedBy (const PermutationMatrix< Dynamic, Dynamic, StorageIndex > &perm) const
 
const TriangularView< const BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >, Mode > triangularView () const
 
ConstSelfAdjointViewReturnType< UpLo >::Type selfadjointView () const
 
SelfAdjointViewReturnType< UpLo >::Type selfadjointView ()
 
SparseMatrixBase< BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ > >::template ConstSelfAdjointViewReturnType< UpLo >::Type selfadjointView () const
 
SparseMatrixBase< BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ > >::template SelfAdjointViewReturnType< UpLo >::Type selfadjointView ()
 
Scalar dot (const MatrixBase< OtherDerived > &other) const
 
Scalar dot (const SparseMatrixBase< OtherDerived > &other) const
 
internal::traits< BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ > >::Scalar dot (const MatrixBase< OtherDerived > &other) const
 
internal::traits< BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ > >::Scalar dot (const SparseMatrixBase< OtherDerived > &other) const
 
RealScalar squaredNorm () const
 
RealScalar norm () const
 
RealScalar blueNorm () const
 
TransposeReturnType transpose ()
 
const ConstTransposeReturnType transpose () const
 
const AdjointReturnType adjoint () const
 
DenseMatrixType toDense () const
 
bool isApprox (const SparseMatrixBase< OtherDerived > &other, const RealScalar &prec=NumTraits< Scalar >::dummy_precision()) const
 
bool isApprox (const MatrixBase< OtherDerived > &other, const RealScalar &prec=NumTraits< Scalar >::dummy_precision()) const
 
const internal::eval< BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ > >::type eval () const
 
Scalar sum () const
 
const SparseView< BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ > > pruned (const Scalar &reference=Scalar(0), const RealScalar &epsilon=NumTraits< Scalar >::dummy_precision()) const
 
- Public Member Functions inherited from Eigen::EigenBase< BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ > >
constexpr EIGEN_DEVICE_FUNC BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ > & derived ()
 
constexpr EIGEN_DEVICE_FUNC const BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ > & derived () const
 
EIGEN_DEVICE_FUNC BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ > & const_cast_derived () const
 
EIGEN_DEVICE_FUNC const BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ > & const_derived () const
 
EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index rows () const EIGEN_NOEXCEPT
 
EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index cols () const EIGEN_NOEXCEPT
 
EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index size () const EIGEN_NOEXCEPT
 
EIGEN_DEVICE_FUNC void evalTo (Dest &dst) const
 
EIGEN_DEVICE_FUNC void addTo (Dest &dst) const
 
EIGEN_DEVICE_FUNC void subTo (Dest &dst) const
 
EIGEN_DEVICE_FUNC void applyThisOnTheRight (Dest &dst) const
 
EIGEN_DEVICE_FUNC void applyThisOnTheLeft (Dest &dst) const
 
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE DeviceWrapper< BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >, Device > device (Device &device)
 
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE DeviceWrapper< const BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >, Device > device (Device &device) const
 

Protected Member Functions

Map< BlockScalarinsert (Index brow, Index bcol)
 
- Protected Member Functions inherited from Eigen::SparseMatrixBase< BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ > >
BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ > & assign (const OtherDerived &other)
 
void assignGeneric (const OtherDerived &other)
 

Protected Attributes

Index m_innerBSize
 
Index m_outerBSize
 
StorageIndexm_innerOffset
 
StorageIndexm_outerOffset
 
Index m_nonzerosblocks
 
Index m_nonzeros
 
Scalarm_values
 
StorageIndexm_blockPtr
 
StorageIndexm_indices
 
StorageIndexm_outerIndex
 
Index m_blockSize
 
- Protected Attributes inherited from Eigen::SparseMatrixBase< BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ > >
bool m_isRValue
 

Friends

void swap (BlockSparseMatrix &first, BlockSparseMatrix &second)
 
std::ostream & operator<< (std::ostream &s, const BlockSparseMatrix &m)
 

Additional Inherited Members

- Static Protected Member Functions inherited from Eigen::SparseMatrixBase< BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ > >
static StorageIndex convert_index (const Index idx)
 

Detailed Description

template<typename Scalar_, int _BlockAtCompileTime, int Options_, typename StorageIndex_>
class Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >

A versatile sparse matrix representation where each element is a block.

This class provides routines to manipulate block sparse matrices stored in a BSR-like representation. There are two main types :

  1. All blocks have the same number of rows and columns, called block size in the following. In this case, if this block size is known at compile time, it can be given as a template parameter like
    BlockSparseMatrix<Scalar, 3, ColMajor> bmat(b_rows, b_cols);
    Here, bmat is a b_rows x b_cols block sparse matrix where each coefficient is a 3x3 dense matrix. If the block size is fixed but will be given at runtime,
    BlockSparseMatrix<Scalar, Dynamic, ColMajor> bmat(b_rows, b_cols);
    bmat.setBlockSize(block_size);
  2. The second case is for variable-block sparse matrices. Here each block has its own dimensions. The only restriction is that all the blocks in a row (resp. a column) should have the same number of rows (resp. of columns). It is thus required in this case to describe the layout of the matrix by calling setBlockLayout(rowBlocks, colBlocks).

In any of the previous case, the matrix can be filled by calling setFromTriplets(). A regular sparse matrix can be converted to a block sparse matrix and vice versa. It is obviously required to describe the block layout beforehand by calling either setBlockSize() for fixed-size blocks or setBlockLayout for variable-size blocks.

Template Parameters
Scalar_The Scalar type
_BlockAtCompileTimeThe block layout option. It takes the following values Dynamic : block size known at runtime a numeric number : fixed-size block known at compile time

Member Typedef Documentation

◆ BlockRealScalar

template<typename Scalar_ , int _BlockAtCompileTime, int Options_, typename StorageIndex_ >
typedef Matrix<RealScalar, _BlockAtCompileTime, _BlockAtCompileTime, IsColMajor ? ColMajor : RowMajor> Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::BlockRealScalar

◆ BlockScalar

template<typename Scalar_ , int _BlockAtCompileTime, int Options_, typename StorageIndex_ >
typedef Matrix<Scalar, _BlockAtCompileTime, _BlockAtCompileTime, IsColMajor ? ColMajor : RowMajor> Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::BlockScalar

◆ BlockScalarReturnType

template<typename Scalar_ , int _BlockAtCompileTime, int Options_, typename StorageIndex_ >
typedef std::conditional_t<_BlockAtCompileTime == Dynamic, Scalar, BlockScalar> Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::BlockScalarReturnType

◆ Nested

template<typename Scalar_ , int _BlockAtCompileTime, int Options_, typename StorageIndex_ >
typedef internal::ref_selector<BlockSparseMatrix<Scalar_, _BlockAtCompileTime, Options_, StorageIndex_> >::type Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::Nested

◆ PlainObject

template<typename Scalar_ , int _BlockAtCompileTime, int Options_, typename StorageIndex_ >
typedef BlockSparseMatrix<Scalar, BlockSize, IsColMajor ? ColMajor : RowMajor, StorageIndex> Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::PlainObject

◆ RealScalar

template<typename Scalar_ , int _BlockAtCompileTime, int Options_, typename StorageIndex_ >
typedef NumTraits<Scalar>::Real Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::RealScalar

◆ Scalar

template<typename Scalar_ , int _BlockAtCompileTime, int Options_, typename StorageIndex_ >
typedef Scalar_ Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::Scalar

◆ StorageIndex

template<typename Scalar_ , int _BlockAtCompileTime, int Options_, typename StorageIndex_ >
typedef StorageIndex_ Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::StorageIndex

Member Enumeration Documentation

◆ anonymous enum

template<typename Scalar_ , int _BlockAtCompileTime, int Options_, typename StorageIndex_ >
anonymous enum
Enumerator
Options 
Flags 
BlockSize 
RowsAtCompileTime 
ColsAtCompileTime 
MaxRowsAtCompileTime 
MaxColsAtCompileTime 
IsVectorAtCompileTime 
IsColMajor 
261  {
262  Options = Options_,
263  Flags = Options,
264  BlockSize = _BlockAtCompileTime,
270  IsColMajor = Flags & RowMajorBit ? 0 : 1
271  };
@ IsColMajor
Definition: BlockSparseMatrix.h:270
@ MaxColsAtCompileTime
Definition: BlockSparseMatrix.h:268
@ RowsAtCompileTime
Definition: BlockSparseMatrix.h:265
@ IsVectorAtCompileTime
Definition: BlockSparseMatrix.h:269
@ BlockSize
Definition: BlockSparseMatrix.h:264
@ ColsAtCompileTime
Definition: BlockSparseMatrix.h:266
@ MaxRowsAtCompileTime
Definition: BlockSparseMatrix.h:267
@ Options
Definition: BlockSparseMatrix.h:262
const unsigned int RowMajorBit
Definition: Constants.h:70
const int Dynamic
Definition: Constants.h:25
Extend namespace for flags.
Definition: fsi_chan_precond_driver.cc:56

Constructor & Destructor Documentation

◆ BlockSparseMatrix() [1/4]

template<typename Scalar_ , int _BlockAtCompileTime, int Options_, typename StorageIndex_ >
Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::BlockSparseMatrix ( )
inline
281  : m_innerBSize(0),
282  m_outerBSize(0),
283  m_innerOffset(0),
284  m_outerOffset(0),
285  m_nonzerosblocks(0),
286  m_values(0),
287  m_blockPtr(0),
288  m_indices(0),
289  m_outerIndex(0),
Index m_blockSize
Definition: BlockSparseMatrix.h:879
StorageIndex * m_indices
Definition: BlockSparseMatrix.h:877
Index m_innerBSize
Definition: BlockSparseMatrix.h:868
Scalar * m_values
Definition: BlockSparseMatrix.h:874
StorageIndex * m_outerOffset
Definition: BlockSparseMatrix.h:871
StorageIndex * m_blockPtr
Definition: BlockSparseMatrix.h:875
Index m_nonzerosblocks
Definition: BlockSparseMatrix.h:872
StorageIndex * m_innerOffset
Definition: BlockSparseMatrix.h:870
StorageIndex * m_outerIndex
Definition: BlockSparseMatrix.h:878
Index m_outerBSize
Definition: BlockSparseMatrix.h:869

◆ BlockSparseMatrix() [2/4]

template<typename Scalar_ , int _BlockAtCompileTime, int Options_, typename StorageIndex_ >
Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::BlockSparseMatrix ( Index  brow,
Index  bcol 
)
inline

Construct and resize.

297  : m_innerBSize(IsColMajor ? brow : bcol),
298  m_outerBSize(IsColMajor ? bcol : brow),
299  m_innerOffset(0),
300  m_outerOffset(0),
301  m_nonzerosblocks(0),
302  m_values(0),
303  m_blockPtr(0),
304  m_indices(0),
305  m_outerIndex(0),

◆ BlockSparseMatrix() [3/4]

template<typename Scalar_ , int _BlockAtCompileTime, int Options_, typename StorageIndex_ >
Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::BlockSparseMatrix ( const BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ > &  other)
inline

Copy-constructor.

312  : m_innerBSize(other.m_innerBSize),
313  m_outerBSize(other.m_outerBSize),
314  m_nonzerosblocks(other.m_nonzerosblocks),
315  m_nonzeros(other.m_nonzeros),
316  m_blockPtr(0),
317  m_blockSize(other.m_blockSize) {
318  // should we allow copying between variable-size blocks and fixed-size blocks ??
319  eigen_assert(m_blockSize == BlockSize && " CAN NOT COPY BETWEEN FIXED-SIZE AND VARIABLE-SIZE BLOCKS");
320 
321  std::copy(other.m_innerOffset, other.m_innerOffset + m_innerBSize + 1, m_innerOffset);
322  std::copy(other.m_outerOffset, other.m_outerOffset + m_outerBSize + 1, m_outerOffset);
323  std::copy(other.m_values, other.m_values + m_nonzeros, m_values);
324 
325  if (m_blockSize != Dynamic) std::copy(other.m_blockPtr, other.m_blockPtr + m_nonzerosblocks, m_blockPtr);
326 
327  std::copy(other.m_indices, other.m_indices + m_nonzerosblocks, m_indices);
328  std::copy(other.m_outerIndex, other.m_outerIndex + m_outerBSize, m_outerIndex);
329  }
#define eigen_assert(x)
Definition: Macros.h:910
Index m_nonzeros
Definition: BlockSparseMatrix.h:873
EIGEN_BLAS_FUNC() copy(int *n, RealScalar *px, int *incx, RealScalar *py, int *incy)
Definition: level1_impl.h:32

References Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::BlockSize, copy(), Eigen::Dynamic, eigen_assert, Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::m_blockPtr, Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::m_blockSize, Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::m_indices, Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::m_innerBSize, Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::m_innerOffset, Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::m_nonzeros, Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::m_nonzerosblocks, Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::m_outerBSize, Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::m_outerIndex, Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::m_outerOffset, and Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::m_values.

◆ ~BlockSparseMatrix()

◆ BlockSparseMatrix() [4/4]

template<typename Scalar_ , int _BlockAtCompileTime, int Options_, typename StorageIndex_ >
template<typename MatrixType >
Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::BlockSparseMatrix ( const MatrixType spmat)
inline

Constructor from a sparse matrix.

367  EIGEN_STATIC_ASSERT((m_blockSize != Dynamic), THIS_METHOD_IS_ONLY_FOR_FIXED_SIZE);
368 
369  *this = spmat;
370  }
#define EIGEN_STATIC_ASSERT(X, MSG)
Definition: StaticAssert.h:26

References Eigen::Dynamic, EIGEN_STATIC_ASSERT, and Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::m_blockSize.

Member Function Documentation

◆ blockCols()

◆ blockColsIndex()

template<typename Scalar_ , int _BlockAtCompileTime, int Options_, typename StorageIndex_ >
Index Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::blockColsIndex ( Index  bj) const
inline

◆ blockInnerIndex()

◆ blockInnerSize()

◆ blockOuterIndex()

◆ blockOuterSize()

◆ blockPtr()

template<typename Scalar_ , int _BlockAtCompileTime, int Options_, typename StorageIndex_ >
Index Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::blockPtr ( Index  id) const
inline

◆ blockRows()

◆ blockRowsIndex()

template<typename Scalar_ , int _BlockAtCompileTime, int Options_, typename StorageIndex_ >
Index Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::blockRowsIndex ( Index  bi) const
inline

◆ coeff()

template<typename Scalar_ , int _BlockAtCompileTime, int Options_, typename StorageIndex_ >
Map<const BlockScalar> Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::coeff ( Index  brow,
Index  bcol 
) const
inline
Returns
the value of the (i,j) block as an Eigen Dense Matrix
759  {
760  eigen_assert(brow < blockRows() && "BLOCK ROW INDEX OUT OF BOUNDS");
761  eigen_assert(bcol < blockCols() && "BLOCK COLUMN OUT OF BOUNDS");
762 
763  StorageIndex rsize = IsColMajor ? blockInnerSize(brow) : blockOuterSize(bcol);
764  StorageIndex csize = IsColMajor ? blockOuterSize(bcol) : blockInnerSize(brow);
765  StorageIndex inner = IsColMajor ? brow : bcol;
766  StorageIndex outer = IsColMajor ? bcol : brow;
767  StorageIndex offset = m_outerIndex[outer];
768  while (offset < m_outerIndex[outer + 1] && m_indices[offset] != inner) offset++;
769  if (m_indices[offset] == inner) {
770  return Map<const BlockScalar>(&(m_values[blockPtr(offset)]), rsize, csize);
771  } else
772  // return BlockScalar::Zero(rsize, csize);
773  eigen_assert("NOT YET SUPPORTED");
774  }
Index blockCols() const
Definition: BlockSparseMatrix.h:709
Index blockPtr(Index id) const
Definition: BlockSparseMatrix.h:846
StorageIndex_ StorageIndex
Definition: BlockSparseMatrix.h:256
Index blockInnerSize(Index bi) const
Definition: BlockSparseMatrix.h:814
Index blockRows() const
Definition: BlockSparseMatrix.h:707
Index blockOuterSize(Index bj) const
Definition: BlockSparseMatrix.h:817

References Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::blockCols(), Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::blockInnerSize(), Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::blockOuterSize(), Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::blockPtr(), Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::blockRows(), eigen_assert, Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::IsColMajor, Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::m_indices, Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::m_outerIndex, and Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::m_values.

◆ coeffRef()

template<typename Scalar_ , int _BlockAtCompileTime, int Options_, typename StorageIndex_ >
Ref<BlockScalar> Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::coeffRef ( Index  brow,
Index  bcol 
)
inline
Returns
a reference to the (i,j) block as an Eigen Dense Matrix
738  {
739  eigen_assert(brow < blockRows() && "BLOCK ROW INDEX OUT OF BOUNDS");
740  eigen_assert(bcol < blockCols() && "BLOCK nzblocksFlagCOLUMN OUT OF BOUNDS");
741 
742  StorageIndex rsize = IsColMajor ? blockInnerSize(brow) : blockOuterSize(bcol);
743  StorageIndex csize = IsColMajor ? blockOuterSize(bcol) : blockInnerSize(brow);
744  StorageIndex inner = IsColMajor ? brow : bcol;
745  StorageIndex outer = IsColMajor ? bcol : brow;
746  StorageIndex offset = m_outerIndex[outer];
747  while (offset < m_outerIndex[outer + 1] && m_indices[offset] != inner) offset++;
748  if (m_indices[offset] == inner) {
749  return Map<BlockScalar>(&(m_values[blockPtr(offset)]), rsize, csize);
750  } else {
751  // FIXME the block does not exist, Insert it !!!!!!!!!
752  eigen_assert("DYNAMIC INSERTION IS NOT YET SUPPORTED");
753  }
754  }

References Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::blockCols(), Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::blockInnerSize(), Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::blockOuterSize(), Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::blockPtr(), Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::blockRows(), eigen_assert, Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::IsColMajor, Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::m_indices, Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::m_outerIndex, and Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::m_values.

◆ cols()

◆ innerBlocks()

template<typename Scalar_ , int _BlockAtCompileTime, int Options_, typename StorageIndex_ >
Index Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::innerBlocks ( ) const
inline

◆ innerIndexPtr() [1/2]

template<typename Scalar_ , int _BlockAtCompileTime, int Options_, typename StorageIndex_ >
StorageIndex* Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::innerIndexPtr ( )
inline

◆ innerIndexPtr() [2/2]

template<typename Scalar_ , int _BlockAtCompileTime, int Options_, typename StorageIndex_ >
const StorageIndex* Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::innerIndexPtr ( ) const
inline

◆ innerSize()

◆ innerToBlock()

template<typename Scalar_ , int _BlockAtCompileTime, int Options_, typename StorageIndex_ >
Index Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::innerToBlock ( Index  inner) const
inline

◆ insert()

template<typename Scalar_ , int _BlockAtCompileTime, int Options_, typename StorageIndex_ >
Map<BlockScalar> Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::insert ( Index  brow,
Index  bcol 
)
protected

◆ isCompressed()

template<typename Scalar_ , int _BlockAtCompileTime, int Options_, typename StorageIndex_ >
bool Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::isCompressed ( ) const
inline

for compatibility purposes with the SparseMatrix class

795 { return true; }

◆ nonZeros()

template<typename Scalar_ , int _BlockAtCompileTime, int Options_, typename StorageIndex_ >
Index Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::nonZeros ( ) const
inline
Returns
the total number of nonzero elements, including eventual explicit zeros in blocks
785 { return m_nonzeros; }

References Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::m_nonzeros.

◆ nonZerosBlocks()

template<typename Scalar_ , int _BlockAtCompileTime, int Options_, typename StorageIndex_ >
Index Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::nonZerosBlocks ( ) const
inline

◆ operator*()

template<typename Scalar_ , int _BlockAtCompileTime, int Options_, typename StorageIndex_ >
template<typename VecType >
BlockSparseTimeDenseProduct<BlockSparseMatrix, VecType> Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::operator* ( const VecType &  lhs) const
inline
778  {
779  return BlockSparseTimeDenseProduct<BlockSparseMatrix, VecType>(*this, lhs);
780  }

◆ operator=() [1/2]

template<typename Scalar_ , int _BlockAtCompileTime, int Options_, typename StorageIndex_ >
BlockSparseMatrix& Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::operator= ( BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >  other)
inline
345  {
346  // Copy-and-swap paradigm ... avoid leaked data if thrown
347  swap(*this, other);
348  return *this;
349  }
friend void swap(BlockSparseMatrix &first, BlockSparseMatrix &second)
Definition: BlockSparseMatrix.h:331

References Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::swap.

◆ operator=() [2/2]

template<typename Scalar_ , int _BlockAtCompileTime, int Options_, typename StorageIndex_ >
template<typename MatrixType >
BlockSparseMatrix& Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::operator= ( const MatrixType spmat)
inline

Assignment from a sparse matrix with the same storage order.

Convert from a sparse matrix to block sparse matrix.

Warning
Before calling this function, tt is necessary to call either setBlockLayout() (matrices with variable-size blocks) or setBlockSize() (for fixed-size blocks).
381  {
382  eigen_assert((m_innerBSize != 0 && m_outerBSize != 0) &&
383  "Trying to assign to a zero-size matrix, call resize() first");
384  eigen_assert(((MatrixType::Options & RowMajorBit) != IsColMajor) && "Wrong storage order");
385  typedef SparseMatrix<bool, MatrixType::Options, typename MatrixType::Index> MatrixPatternType;
386  MatrixPatternType blockPattern(blockRows(), blockCols());
387  m_nonzeros = 0;
388 
389  // First, compute the number of nonzero blocks and their locations
390  for (StorageIndex bj = 0; bj < m_outerBSize; ++bj) {
391  // Browse each outer block and compute the structure
392  std::vector<bool> nzblocksFlag(m_innerBSize, false); // Record the existing blocks
393  blockPattern.startVec(bj);
394  for (StorageIndex j = blockOuterIndex(bj); j < blockOuterIndex(bj + 1); ++j) {
395  typename MatrixType::InnerIterator it_spmat(spmat, j);
396  for (; it_spmat; ++it_spmat) {
397  StorageIndex bi = innerToBlock(it_spmat.index()); // Index of the current nonzero block
398  if (!nzblocksFlag[bi]) {
399  // Save the index of this nonzero block
400  nzblocksFlag[bi] = true;
401  blockPattern.insertBackByOuterInnerUnordered(bj, bi) = true;
402  // Compute the total number of nonzeros (including explicit zeros in blocks)
404  }
405  }
406  } // end current outer block
407  }
408  blockPattern.finalize();
409 
410  // Allocate the internal arrays
411  setBlockStructure(blockPattern);
412 
413  for (StorageIndex nz = 0; nz < m_nonzeros; ++nz) m_values[nz] = Scalar(0);
414  for (StorageIndex bj = 0; bj < m_outerBSize; ++bj) {
415  // Now copy the values
416  for (StorageIndex j = blockOuterIndex(bj); j < blockOuterIndex(bj + 1); ++j) {
417  // Browse the outer block column by column (for column-major matrices)
418  typename MatrixType::InnerIterator it_spmat(spmat, j);
419  for (; it_spmat; ++it_spmat) {
420  StorageIndex idx = 0; // Position of this block in the column block
421  StorageIndex bi = innerToBlock(it_spmat.index()); // Index of the current nonzero block
422  // Go to the inner block where this element belongs to
423  while (bi > m_indices[m_outerIndex[bj] + idx]) ++idx; // Not expensive for ordered blocks
424  StorageIndex idxVal; // Get the right position in the array of values for this element
425  if (m_blockSize == Dynamic) {
426  // Offset from all blocks before ...
427  idxVal = m_blockPtr[m_outerIndex[bj] + idx];
428  // ... and offset inside the block
429  idxVal += (j - blockOuterIndex(bj)) * blockOuterSize(bj) + it_spmat.index() - m_innerOffset[bi];
430  } else {
431  // All blocks before
432  idxVal = (m_outerIndex[bj] + idx) * m_blockSize * m_blockSize;
433  // inside the block
434  idxVal += (j - blockOuterIndex(bj)) * m_blockSize + (it_spmat.index() % m_blockSize);
435  }
436  // Insert the value
437  m_values[idxVal] = it_spmat.value();
438  } // end of this column
439  } // end of this block
440  } // end of this outer block
441 
442  return *this;
443  }
Index innerToBlock(Index inner) const
Definition: BlockSparseMatrix.h:725
void setBlockStructure(const MatrixType &blockPattern)
Set the nonzero block pattern of the matrix.
Definition: BlockSparseMatrix.h:463
Scalar_ Scalar
Definition: BlockSparseMatrix.h:254
const unsigned nz
Definition: ConstraintElementsUnitTest.cpp:32
std::ptrdiff_t j
Definition: tut_arithmetic_redux_minmax.cpp:2

References Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::blockCols(), Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::blockInnerSize(), Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::blockOuterIndex(), Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::blockOuterSize(), Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::blockRows(), Eigen::Dynamic, eigen_assert, Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::innerToBlock(), Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::IsColMajor, j, Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::m_blockPtr, Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::m_blockSize, Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::m_indices, Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::m_innerBSize, Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::m_innerOffset, Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::m_nonzeros, Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::m_outerBSize, Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::m_outerIndex, Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::m_values, Mesh_Parameters::nz, Eigen::RowMajorBit, and Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::setBlockStructure().

◆ outerBlocks()

template<typename Scalar_ , int _BlockAtCompileTime, int Options_, typename StorageIndex_ >
Index Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::outerBlocks ( ) const
inline

◆ outerIndexPtr() [1/2]

template<typename Scalar_ , int _BlockAtCompileTime, int Options_, typename StorageIndex_ >
StorageIndex* Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::outerIndexPtr ( )
inline

◆ outerIndexPtr() [2/2]

template<typename Scalar_ , int _BlockAtCompileTime, int Options_, typename StorageIndex_ >
const StorageIndex* Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::outerIndexPtr ( ) const
inline

◆ outerSize()

◆ outerToBlock()

template<typename Scalar_ , int _BlockAtCompileTime, int Options_, typename StorageIndex_ >
Index Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::outerToBlock ( Index  outer) const
inline
Returns
the block index where outer belongs to
715  {
716  eigen_assert(outer < outerSize() && "OUTER INDEX OUT OF BOUNDS");
717 
718  if (m_blockSize != Dynamic) return (outer / m_blockSize); // Integer division
719 
720  StorageIndex b_outer = 0;
721  while (m_outerOffset[b_outer] <= outer) ++b_outer;
722  return b_outer - 1;
723  }

References Eigen::Dynamic, eigen_assert, Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::m_blockSize, Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::m_outerOffset, and Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::outerSize().

◆ reserve()

template<typename Scalar_ , int _BlockAtCompileTime, int Options_, typename StorageIndex_ >
void Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::reserve ( const Index  nonzerosblocks)
inline

Allocate the internal array of pointers to blocks and their inner indices.

Note
For fixed-size blocks, call setBlockSize() to set the block. And For variable-size blocks, call setBlockLayout() before using this function
Parameters
nonzerosblocksNumber of nonzero blocks. The total number of nonzeros is is computed in setBlockLayout() for variable-size blocks
See also
setBlockSize()
550  {
551  eigen_assert((m_innerBSize != 0 && m_outerBSize != 0) &&
552  "TRYING TO RESERVE ZERO-SIZE MATRICES, CALL resize() first");
553 
554  // FIXME Should free if already allocated
556 
557  m_nonzerosblocks = nonzerosblocks;
558  if (m_blockSize != Dynamic) {
559  m_nonzeros = nonzerosblocks * (m_blockSize * m_blockSize);
560  m_blockPtr = 0;
561  } else {
562  // m_nonzeros is already computed in setBlockLayout()
564  }
566  m_values = new Scalar[m_nonzeros];
567  }
SCALAR Scalar
Definition: bench_gemm.cpp:45

References Eigen::Dynamic, eigen_assert, Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::m_blockPtr, Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::m_blockSize, Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::m_indices, Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::m_innerBSize, Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::m_nonzeros, Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::m_nonzerosblocks, Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::m_outerBSize, Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::m_outerIndex, and Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::m_values.

Referenced by Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::setBlockStructure(), and Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::setFromTriplets().

◆ resize()

template<typename Scalar_ , int _BlockAtCompileTime, int Options_, typename StorageIndex_ >
void Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::resize ( Index  brow,
Index  bcol 
)
inline

◆ rows()

◆ setBlockLayout()

template<typename Scalar_ , int _BlockAtCompileTime, int Options_, typename StorageIndex_ >
void Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::setBlockLayout ( const VectorXi &  rowBlocks,
const VectorXi &  colBlocks 
)
inline

Set the row and column block layouts,.

This function set the size of each row and column block. So this function should be used only for blocks with variable size.

Parameters
rowBlocks: Number of rows per row block
colBlocks: Number of columns per column block
See also
resize(), setBlockSize()
520  {
521  const VectorXi& innerBlocks = IsColMajor ? rowBlocks : colBlocks;
522  const VectorXi& outerBlocks = IsColMajor ? colBlocks : rowBlocks;
523  eigen_assert(m_innerBSize == innerBlocks.size() && "CHECK THE NUMBER OF ROW OR COLUMN BLOCKS");
524  eigen_assert(m_outerBSize == outerBlocks.size() && "CHECK THE NUMBER OF ROW OR COLUMN BLOCKS");
525  m_outerBSize = outerBlocks.size();
526  // starting index of blocks... cumulative sums
529  m_innerOffset[0] = 0;
530  m_outerOffset[0] = 0;
531  std::partial_sum(&innerBlocks[0], &innerBlocks[m_innerBSize - 1] + 1, &m_innerOffset[1]);
532  std::partial_sum(&outerBlocks[0], &outerBlocks[m_outerBSize - 1] + 1, &m_outerOffset[1]);
533 
534  // Compute the total number of nonzeros
535  m_nonzeros = 0;
536  for (StorageIndex bj = 0; bj < m_outerBSize; ++bj)
537  for (StorageIndex bi = 0; bi < m_innerBSize; ++bi) m_nonzeros += outerBlocks[bj] * innerBlocks[bi];
538  }
Index innerBlocks() const
Definition: BlockSparseMatrix.h:712
Index outerBlocks() const
Definition: BlockSparseMatrix.h:711

References eigen_assert, Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::innerBlocks(), Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::IsColMajor, Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::m_innerBSize, Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::m_innerOffset, Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::m_nonzeros, Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::m_outerBSize, Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::m_outerOffset, and Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::outerBlocks().

Referenced by Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::setFromTriplets().

◆ setBlockSize()

template<typename Scalar_ , int _BlockAtCompileTime, int Options_, typename StorageIndex_ >
void Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::setBlockSize ( Index  blockSize)
inline

set the block size at runtime for fixed-size block layout

Call this only for fixed-size blocks

509 { m_blockSize = blockSize; }

References Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::m_blockSize.

◆ setBlockStructure()

template<typename Scalar_ , int _BlockAtCompileTime, int Options_, typename StorageIndex_ >
template<typename MatrixType >
void Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::setBlockStructure ( const MatrixType blockPattern)
inline

Set the nonzero block pattern of the matrix.

Given a sparse matrix describing the nonzero block pattern, this function prepares the internal pointers for values. After calling this function, any nonzero block (bi, bj) can be set with a simple call to coeffRef(bi,bj).

Warning
Before calling this function, tt is necessary to call either setBlockLayout() (matrices with variable-size blocks) or setBlockSize() (for fixed-size blocks).
Parameters
blockPatternSparse matrix of boolean elements describing the block structure
See also
setBlockLayout()
setBlockSize()
463  {
464  resize(blockPattern.rows(), blockPattern.cols());
465  reserve(blockPattern.nonZeros());
466 
467  // Browse the block pattern and set up the various pointers
468  m_outerIndex[0] = 0;
469  if (m_blockSize == Dynamic) m_blockPtr[0] = 0;
470  for (StorageIndex nz = 0; nz < m_nonzeros; ++nz) m_values[nz] = Scalar(0);
471  for (StorageIndex bj = 0; bj < m_outerBSize; ++bj) {
472  // Browse each outer block
473 
474  // First, copy and save the indices of nonzero blocks
475  // FIXME : find a way to avoid this ...
476  std::vector<int> nzBlockIdx;
477  typename MatrixType::InnerIterator it(blockPattern, bj);
478  for (; it; ++it) {
479  nzBlockIdx.push_back(it.index());
480  }
481  std::sort(nzBlockIdx.begin(), nzBlockIdx.end());
482 
483  // Now, fill block indices and (eventually) pointers to blocks
484  for (StorageIndex idx = 0; idx < nzBlockIdx.size(); ++idx) {
485  StorageIndex offset = m_outerIndex[bj] + idx; // offset in m_indices
486  m_indices[offset] = nzBlockIdx[idx];
487  if (m_blockSize == Dynamic)
488  m_blockPtr[offset] = m_blockPtr[offset - 1] + blockInnerSize(nzBlockIdx[idx]) * blockOuterSize(bj);
489  // There is no blockPtr for fixed-size blocks... not needed !???
490  }
491  // Save the pointer to the next outer block
492  m_outerIndex[bj + 1] = m_outerIndex[bj] + nzBlockIdx.size();
493  }
494  }
void reserve(const Index nonzerosblocks)
Allocate the internal array of pointers to blocks and their inner indices.
Definition: BlockSparseMatrix.h:550
void resize(Index brow, Index bcol)
Set the number of rows and columns blocks.
Definition: BlockSparseMatrix.h:499

References Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::blockInnerSize(), Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::blockOuterSize(), Eigen::Dynamic, Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::m_blockPtr, Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::m_blockSize, Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::m_indices, Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::m_nonzeros, Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::m_outerBSize, Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::m_outerIndex, Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::m_values, Mesh_Parameters::nz, Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::reserve(), and Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::resize().

Referenced by Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::operator=().

◆ setFromTriplets()

template<typename Scalar_ , int _BlockAtCompileTime, int Options_, typename StorageIndex_ >
template<typename InputIterator >
void Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::setFromTriplets ( const InputIterator &  begin,
const InputIterator &  end 
)
inline

Fill values in a matrix from a triplet list.

Each triplet item has a block stored in an Eigen dense matrix. The InputIterator class should provide the functions row(), col() and value()

Note
For fixed-size blocks, call setBlockSize() before this function.

FIXME Do not accept duplicates

580  {
581  eigen_assert((m_innerBSize != 0 && m_outerBSize != 0) && "ZERO BLOCKS, PLEASE CALL resize() before");
582 
583  /* First, sort the triplet list
584  * FIXME This can be unnecessarily expensive since only the inner indices have to be sorted
585  * The best approach is like in SparseMatrix::setFromTriplets()
586  */
587  internal::TripletComp<InputIterator, IsColMajor> tripletcomp;
588  std::sort(begin, end, tripletcomp);
589 
590  /* Count the number of rows and column blocks,
591  * and the number of nonzero blocks per outer dimension
592  */
593  VectorXi rowBlocks(m_innerBSize); // Size of each block row
594  VectorXi colBlocks(m_outerBSize); // Size of each block column
595  rowBlocks.setZero();
596  colBlocks.setZero();
597  VectorXi nzblock_outer(m_outerBSize); // Number of nz blocks per outer vector
598  VectorXi nz_outer(m_outerBSize); // Number of nz per outer vector...for variable-size blocks
599  nzblock_outer.setZero();
600  nz_outer.setZero();
601  for (InputIterator it(begin); it != end; ++it) {
602  eigen_assert(it->row() >= 0 && it->row() < this->blockRows() && it->col() >= 0 && it->col() < this->blockCols());
603  eigen_assert((it->value().rows() == it->value().cols() && (it->value().rows() == m_blockSize)) ||
604  (m_blockSize == Dynamic));
605 
606  if (m_blockSize == Dynamic) {
607  eigen_assert((rowBlocks[it->row()] == 0 || rowBlocks[it->row()] == it->value().rows()) &&
608  "NON CORRESPONDING SIZES FOR ROW BLOCKS");
609  eigen_assert((colBlocks[it->col()] == 0 || colBlocks[it->col()] == it->value().cols()) &&
610  "NON CORRESPONDING SIZES FOR COLUMN BLOCKS");
611  rowBlocks[it->row()] = it->value().rows();
612  colBlocks[it->col()] = it->value().cols();
613  }
614  nz_outer(IsColMajor ? it->col() : it->row()) += it->value().rows() * it->value().cols();
615  nzblock_outer(IsColMajor ? it->col() : it->row())++;
616  }
617  // Allocate member arrays
618  if (m_blockSize == Dynamic) setBlockLayout(rowBlocks, colBlocks);
619  StorageIndex nzblocks = nzblock_outer.sum();
620  reserve(nzblocks);
621 
622  // Temporary markers
623  VectorXi block_id(m_outerBSize); // To be used as a block marker during insertion
624 
625  // Setup outer index pointers and markers
626  m_outerIndex[0] = 0;
627  if (m_blockSize == Dynamic) m_blockPtr[0] = 0;
628  for (StorageIndex bj = 0; bj < m_outerBSize; ++bj) {
629  m_outerIndex[bj + 1] = m_outerIndex[bj] + nzblock_outer(bj);
630  block_id(bj) = m_outerIndex[bj];
631  if (m_blockSize == Dynamic) {
632  m_blockPtr[m_outerIndex[bj + 1]] = m_blockPtr[m_outerIndex[bj]] + nz_outer(bj);
633  }
634  }
635 
636  // Fill the matrix
637  for (InputIterator it(begin); it != end; ++it) {
638  StorageIndex outer = IsColMajor ? it->col() : it->row();
639  StorageIndex inner = IsColMajor ? it->row() : it->col();
640  m_indices[block_id(outer)] = inner;
641  StorageIndex block_size = it->value().rows() * it->value().cols();
642  StorageIndex nz_marker = blockPtr(block_id[outer]);
643  memcpy(&(m_values[nz_marker]), it->value().data(), block_size * sizeof(Scalar));
644  if (m_blockSize == Dynamic) {
645  m_blockPtr[block_id(outer) + 1] = m_blockPtr[block_id(outer)] + block_size;
646  }
647  block_id(outer)++;
648  }
649 
650  // An alternative when the outer indices are sorted...no need to use an array of markers
651  // for(Index bcol = 0; bcol < m_outerBSize; ++bcol)
652  // {
653  // Index id = 0, id_nz = 0, id_nzblock = 0;
654  // for(InputIterator it(begin); it!=end; ++it)
655  // {
656  // while (id<bcol) // one pass should do the job unless there are empty columns
657  // {
658  // id++;
659  // m_outerIndex[id+1]=m_outerIndex[id];
660  // }
661  // m_outerIndex[id+1] += 1;
662  // m_indices[id_nzblock]=brow;
663  // Index block_size = it->value().rows()*it->value().cols();
664  // m_blockPtr[id_nzblock+1] = m_blockPtr[id_nzblock] + block_size;
665  // id_nzblock++;
666  // memcpy(&(m_values[id_nz]),it->value().data(), block_size*sizeof(Scalar));
667  // id_nz += block_size;
668  // }
669  // while(id < m_outerBSize-1) // Empty columns at the end
670  // {
671  // id++;
672  // m_outerIndex[id+1]=m_outerIndex[id];
673  // }
674  // }
675  }
void setBlockLayout(const VectorXi &rowBlocks, const VectorXi &colBlocks)
Set the row and column block layouts,.
Definition: BlockSparseMatrix.h:520
static constexpr lastp1_t end
Definition: IndexedViewHelper.h:79

References Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::blockPtr(), Eigen::Dynamic, eigen_assert, Eigen::placeholders::end, Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::IsColMajor, Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::m_blockPtr, Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::m_blockSize, Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::m_indices, Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::m_innerBSize, Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::m_outerBSize, Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::m_outerIndex, Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::m_values, Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::reserve(), and Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::setBlockLayout().

◆ valuePtr()

template<typename Scalar_ , int _BlockAtCompileTime, int Options_, typename StorageIndex_ >
BlockScalarReturnType* Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::valuePtr ( )
inline
787 { return static_cast<BlockScalarReturnType*>(m_values); }
std::conditional_t< _BlockAtCompileTime==Dynamic, Scalar, BlockScalar > BlockScalarReturnType
Definition: BlockSparseMatrix.h:275

References Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::m_values.

Friends And Related Function Documentation

◆ operator<<

template<typename Scalar_ , int _BlockAtCompileTime, int Options_, typename StorageIndex_ >
std::ostream& operator<< ( std::ostream &  s,
const BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ > &  m 
)
friend
831  {
832  for (StorageIndex j = 0; j < m.outerBlocks(); ++j) {
833  BlockInnerIterator itb(m, j);
834  for (; itb; ++itb) {
835  s << "(" << itb.row() << ", " << itb.col() << ")\n";
836  s << itb.value() << "\n";
837  }
838  }
839  s << std::endl;
840  return s;
841  }
RealScalar s
Definition: level1_cplx_impl.h:130
int * m
Definition: level2_cplx_impl.h:294

◆ swap

template<typename Scalar_ , int _BlockAtCompileTime, int Options_, typename StorageIndex_ >
void swap ( BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ > &  first,
BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ > &  second 
)
friend
331  {
332  std::swap(first.m_innerBSize, second.m_innerBSize);
333  std::swap(first.m_outerBSize, second.m_outerBSize);
334  std::swap(first.m_innerOffset, second.m_innerOffset);
335  std::swap(first.m_outerOffset, second.m_outerOffset);
336  std::swap(first.m_nonzerosblocks, second.m_nonzerosblocks);
337  std::swap(first.m_nonzeros, second.m_nonzeros);
338  std::swap(first.m_values, second.m_values);
339  std::swap(first.m_blockPtr, second.m_blockPtr);
340  std::swap(first.m_indices, second.m_indices);
341  std::swap(first.m_outerIndex, second.m_outerIndex);
342  std::swap(first.m_BlockSize, second.m_blockSize);
343  }
EIGEN_BLAS_FUNC() swap(int *n, RealScalar *px, int *incx, RealScalar *py, int *incy)
Definition: level1_impl.h:117

Referenced by Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::operator=().

Member Data Documentation

◆ m_blockPtr

◆ m_blockSize

template<typename Scalar_ , int _BlockAtCompileTime, int Options_, typename StorageIndex_ >
Index Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::m_blockSize
protected

Referenced by Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::blockInnerIndex(), Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::blockInnerSize(), Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::blockOuterIndex(), Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::blockOuterSize(), Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::blockPtr(), Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::BlockSparseMatrix(), Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::innerSize(), Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::innerToBlock(), Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::operator=(), Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::outerSize(), Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::outerToBlock(), Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::reserve(), Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::setBlockSize(), Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::setBlockStructure(), and Eigen::BlockSparseMatrix< Scalar_, _BlockAtCompileTime, Options_, StorageIndex_ >::setFromTriplets().

◆ m_indices

◆ m_innerBSize

◆ m_innerOffset

◆ m_nonzeros

◆ m_nonzerosblocks

◆ m_outerBSize

◆ m_outerIndex

◆ m_outerOffset

◆ m_values


The documentation for this class was generated from the following file: