TR-mbed 1.0
Loading...
Searching...
No Matches
SparseBlock.h
Go to the documentation of this file.
1// This file is part of Eigen, a lightweight C++ template library
2// for linear algebra.
3//
4// Copyright (C) 2008-2014 Gael Guennebaud <gael.guennebaud@inria.fr>
5//
6// This Source Code Form is subject to the terms of the Mozilla
7// Public License v. 2.0. If a copy of the MPL was not distributed
8// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9
10#ifndef EIGEN_SPARSE_BLOCK_H
11#define EIGEN_SPARSE_BLOCK_H
12
13namespace Eigen {
14
15// Subset of columns or rows
16template<typename XprType, int BlockRows, int BlockCols>
17class BlockImpl<XprType,BlockRows,BlockCols,true,Sparse>
18 : public SparseMatrixBase<Block<XprType,BlockRows,BlockCols,true> >
19{
22public:
24protected:
25 enum { OuterSize = IsRowMajor ? BlockRows : BlockCols };
27 using Base::convert_index;
28public:
30
31 inline BlockImpl(XprType& xpr, Index i)
32 : m_matrix(xpr), m_outerStart(convert_index(i)), m_outerSize(OuterSize)
33 {}
34
35 inline BlockImpl(XprType& xpr, Index startRow, Index startCol, Index blockRows, Index blockCols)
36 : m_matrix(xpr), m_outerStart(convert_index(IsRowMajor ? startRow : startCol)), m_outerSize(convert_index(IsRowMajor ? blockRows : blockCols))
37 {}
38
39 EIGEN_STRONG_INLINE Index rows() const { return IsRowMajor ? m_outerSize.value() : m_matrix.rows(); }
40 EIGEN_STRONG_INLINE Index cols() const { return IsRowMajor ? m_matrix.cols() : m_outerSize.value(); }
41
43 {
44 typedef internal::evaluator<XprType> EvaluatorType;
45 EvaluatorType matEval(m_matrix);
46 Index nnz = 0;
47 Index end = m_outerStart + m_outerSize.value();
48 for(Index j=m_outerStart; j<end; ++j)
49 for(typename EvaluatorType::InnerIterator it(matEval, j); it; ++it)
50 ++nnz;
51 return nnz;
52 }
53
54 inline const Scalar coeff(Index row, Index col) const
55 {
56 return m_matrix.coeff(row + (IsRowMajor ? m_outerStart : 0), col + (IsRowMajor ? 0 : m_outerStart));
57 }
58
59 inline const Scalar coeff(Index index) const
60 {
61 return m_matrix.coeff(IsRowMajor ? m_outerStart : index, IsRowMajor ? index : m_outerStart);
62 }
63
64 inline const XprType& nestedExpression() const { return m_matrix; }
65 inline XprType& nestedExpression() { return m_matrix; }
66 Index startRow() const { return IsRowMajor ? m_outerStart : 0; }
67 Index startCol() const { return IsRowMajor ? 0 : m_outerStart; }
68 Index blockRows() const { return IsRowMajor ? m_outerSize.value() : m_matrix.rows(); }
69 Index blockCols() const { return IsRowMajor ? m_matrix.cols() : m_outerSize.value(); }
70
71 protected:
72
76
77 protected:
78 // Disable assignment with clear error message.
79 // Note that simply removing operator= yields compilation errors with ICC+MSVC
80 template<typename T>
82 {
83 EIGEN_STATIC_ASSERT(sizeof(T)==0, THIS_SPARSE_BLOCK_SUBEXPRESSION_IS_READ_ONLY);
84 return *this;
85 }
86};
87
88
89/***************************************************************************
90* specialization for SparseMatrix
91***************************************************************************/
92
93namespace internal {
94
95template<typename SparseMatrixType, int BlockRows, int BlockCols>
97 : public SparseCompressedBase<Block<SparseMatrixType,BlockRows,BlockCols,true> >
98{
103public:
106protected:
109public:
110
114
118
119 template<typename OtherDerived>
121 {
124 // This assignment is slow if this vector set is not empty
125 // and/or it is not at the end of the nonzeros of the underlying matrix.
126
127 // 1 - eval to a temporary to avoid transposition and/or aliasing issues
129 eigen_internal_assert(tmp.outerSize()==m_outerSize.value());
130
131 // 2 - let's check whether there is enough allocated memory
132 Index nnz = tmp.nonZeros();
133 Index start = m_outerStart==0 ? 0 : m_matrix.outerIndexPtr()[m_outerStart]; // starting position of the current block
134 Index end = m_matrix.outerIndexPtr()[m_outerStart+m_outerSize.value()]; // ending position of the current block
135 Index block_size = end - start; // available room in the current block
136 Index tail_size = m_matrix.outerIndexPtr()[m_matrix.outerSize()] - end;
137
138 Index free_size = m_matrix.isCompressed()
139 ? Index(matrix.data().allocatedSize()) + block_size
140 : block_size;
141
142 Index tmp_start = tmp.outerIndexPtr()[0];
143
144 bool update_trailing_pointers = false;
145 if(nnz>free_size)
146 {
147 // realloc manually to reduce copies
148 typename SparseMatrixType::Storage newdata(m_matrix.data().allocatedSize() - block_size + nnz);
149
150 internal::smart_copy(m_matrix.valuePtr(), m_matrix.valuePtr() + start, newdata.valuePtr());
151 internal::smart_copy(m_matrix.innerIndexPtr(), m_matrix.innerIndexPtr() + start, newdata.indexPtr());
152
153 internal::smart_copy(tmp.valuePtr() + tmp_start, tmp.valuePtr() + tmp_start + nnz, newdata.valuePtr() + start);
154 internal::smart_copy(tmp.innerIndexPtr() + tmp_start, tmp.innerIndexPtr() + tmp_start + nnz, newdata.indexPtr() + start);
155
156 internal::smart_copy(matrix.valuePtr()+end, matrix.valuePtr()+end + tail_size, newdata.valuePtr()+start+nnz);
157 internal::smart_copy(matrix.innerIndexPtr()+end, matrix.innerIndexPtr()+end + tail_size, newdata.indexPtr()+start+nnz);
158
159 newdata.resize(m_matrix.outerIndexPtr()[m_matrix.outerSize()] - block_size + nnz);
160
161 matrix.data().swap(newdata);
162
164 }
165 else
166 {
167 if(m_matrix.isCompressed() && nnz!=block_size)
168 {
169 // no need to realloc, simply copy the tail at its respective position and insert tmp
170 matrix.data().resize(start + nnz + tail_size);
171
172 internal::smart_memmove(matrix.valuePtr()+end, matrix.valuePtr() + end+tail_size, matrix.valuePtr() + start+nnz);
173 internal::smart_memmove(matrix.innerIndexPtr()+end, matrix.innerIndexPtr() + end+tail_size, matrix.innerIndexPtr() + start+nnz);
174
176 }
177
178 internal::smart_copy(tmp.valuePtr() + tmp_start, tmp.valuePtr() + tmp_start + nnz, matrix.valuePtr() + start);
179 internal::smart_copy(tmp.innerIndexPtr() + tmp_start, tmp.innerIndexPtr() + tmp_start + nnz, matrix.innerIndexPtr() + start);
180 }
181
182 // update outer index pointers and innerNonZeros
184 {
185 if(!m_matrix.isCompressed())
186 matrix.innerNonZeroPtr()[m_outerStart] = StorageIndex(nnz);
187 matrix.outerIndexPtr()[m_outerStart] = StorageIndex(start);
188 }
189 else
190 {
191 StorageIndex p = StorageIndex(start);
192 for(Index k=0; k<m_outerSize.value(); ++k)
193 {
194 StorageIndex nnz_k = internal::convert_index<StorageIndex>(tmp.innerVector(k).nonZeros());
195 if(!m_matrix.isCompressed())
196 matrix.innerNonZeroPtr()[m_outerStart+k] = nnz_k;
197 matrix.outerIndexPtr()[m_outerStart+k] = p;
198 p += nnz_k;
199 }
200 }
201
203 {
205 for(Index k = m_outerStart + m_outerSize.value(); k<=matrix.outerSize(); ++k)
206 {
207 matrix.outerIndexPtr()[k] += offset;
208 }
209 }
210
211 return derived();
212 }
213
214 inline BlockType& operator=(const BlockType& other)
215 {
216 return operator=<BlockType>(other);
217 }
218
219 inline const Scalar* valuePtr() const
220 { return m_matrix.valuePtr(); }
221 inline Scalar* valuePtr()
222 { return m_matrix.valuePtr(); }
223
224 inline const StorageIndex* innerIndexPtr() const
225 { return m_matrix.innerIndexPtr(); }
227 { return m_matrix.innerIndexPtr(); }
228
229 inline const StorageIndex* outerIndexPtr() const
230 { return m_matrix.outerIndexPtr() + m_outerStart; }
232 { return m_matrix.outerIndexPtr() + m_outerStart; }
233
234 inline const StorageIndex* innerNonZeroPtr() const
235 { return isCompressed() ? 0 : (m_matrix.innerNonZeroPtr()+m_outerStart); }
237 { return isCompressed() ? 0 : (m_matrix.innerNonZeroPtr()+m_outerStart); }
238
239 bool isCompressed() const { return m_matrix.innerNonZeroPtr()==0; }
240
242 {
243 return m_matrix.coeffRef(row + (IsRowMajor ? m_outerStart : 0), col + (IsRowMajor ? 0 : m_outerStart));
244 }
245
246 inline const Scalar coeff(Index row, Index col) const
247 {
248 return m_matrix.coeff(row + (IsRowMajor ? m_outerStart : 0), col + (IsRowMajor ? 0 : m_outerStart));
249 }
250
251 inline const Scalar coeff(Index index) const
252 {
253 return m_matrix.coeff(IsRowMajor ? m_outerStart : index, IsRowMajor ? index : m_outerStart);
254 }
255
256 const Scalar& lastCoeff() const
257 {
260 if(m_matrix.isCompressed())
261 return m_matrix.valuePtr()[m_matrix.outerIndexPtr()[m_outerStart+1]-1];
262 else
263 return m_matrix.valuePtr()[m_matrix.outerIndexPtr()[m_outerStart]+m_matrix.innerNonZeroPtr()[m_outerStart]-1];
264 }
265
266 EIGEN_STRONG_INLINE Index rows() const { return IsRowMajor ? m_outerSize.value() : m_matrix.rows(); }
267 EIGEN_STRONG_INLINE Index cols() const { return IsRowMajor ? m_matrix.cols() : m_outerSize.value(); }
268
269 inline const SparseMatrixType& nestedExpression() const { return m_matrix; }
270 inline SparseMatrixType& nestedExpression() { return m_matrix; }
271 Index startRow() const { return IsRowMajor ? m_outerStart : 0; }
272 Index startCol() const { return IsRowMajor ? 0 : m_outerStart; }
273 Index blockRows() const { return IsRowMajor ? m_outerSize.value() : m_matrix.rows(); }
274 Index blockCols() const { return IsRowMajor ? m_matrix.cols() : m_outerSize.value(); }
275
276 protected:
277
281
282};
283
284} // namespace internal
285
286template<typename _Scalar, int _Options, typename _StorageIndex, int BlockRows, int BlockCols>
287class BlockImpl<SparseMatrix<_Scalar, _Options, _StorageIndex>,BlockRows,BlockCols,true,Sparse>
288 : public internal::sparse_matrix_block_impl<SparseMatrix<_Scalar, _Options, _StorageIndex>,BlockRows,BlockCols>
289{
290public:
291 typedef _StorageIndex StorageIndex;
295 : Base(xpr, i)
296 {}
297
298 inline BlockImpl(SparseMatrixType& xpr, Index startRow, Index startCol, Index blockRows, Index blockCols)
299 : Base(xpr, startRow, startCol, blockRows, blockCols)
300 {}
301
302 using Base::operator=;
303};
304
305template<typename _Scalar, int _Options, typename _StorageIndex, int BlockRows, int BlockCols>
306class BlockImpl<const SparseMatrix<_Scalar, _Options, _StorageIndex>,BlockRows,BlockCols,true,Sparse>
307 : public internal::sparse_matrix_block_impl<const SparseMatrix<_Scalar, _Options, _StorageIndex>,BlockRows,BlockCols>
308{
309public:
310 typedef _StorageIndex StorageIndex;
314 : Base(xpr, i)
315 {}
316
317 inline BlockImpl(SparseMatrixType& xpr, Index startRow, Index startCol, Index blockRows, Index blockCols)
318 : Base(xpr, startRow, startCol, blockRows, blockCols)
319 {}
320
321 using Base::operator=;
322private:
323 template<typename Derived> BlockImpl(const SparseMatrixBase<Derived>& xpr, Index i);
324 template<typename Derived> BlockImpl(const SparseMatrixBase<Derived>& xpr);
325};
326
327//----------
328
332template<typename XprType, int BlockRows, int BlockCols, bool InnerPanel>
333class BlockImpl<XprType,BlockRows,BlockCols,InnerPanel,Sparse>
334 : public SparseMatrixBase<Block<XprType,BlockRows,BlockCols,InnerPanel> >, internal::no_assignment_operator
335{
338 using Base::convert_index;
339public:
342
343 typedef typename internal::remove_all<typename XprType::Nested>::type _MatrixTypeNested;
344
347 inline BlockImpl(XprType& xpr, Index i)
348 : m_matrix(xpr),
349 m_startRow( (BlockRows==1) && (BlockCols==XprType::ColsAtCompileTime) ? convert_index(i) : 0),
350 m_startCol( (BlockRows==XprType::RowsAtCompileTime) && (BlockCols==1) ? convert_index(i) : 0),
351 m_blockRows(BlockRows==1 ? 1 : xpr.rows()),
352 m_blockCols(BlockCols==1 ? 1 : xpr.cols())
353 {}
354
357 inline BlockImpl(XprType& xpr, Index startRow, Index startCol, Index blockRows, Index blockCols)
358 : m_matrix(xpr), m_startRow(convert_index(startRow)), m_startCol(convert_index(startCol)), m_blockRows(convert_index(blockRows)), m_blockCols(convert_index(blockCols))
359 {}
360
361 inline Index rows() const { return m_blockRows.value(); }
362 inline Index cols() const { return m_blockCols.value(); }
363
365 {
366 return m_matrix.coeffRef(row + m_startRow.value(), col + m_startCol.value());
367 }
368
369 inline const Scalar coeff(Index row, Index col) const
370 {
371 return m_matrix.coeff(row + m_startRow.value(), col + m_startCol.value());
372 }
373
374 inline Scalar& coeffRef(Index index)
375 {
376 return m_matrix.coeffRef(m_startRow.value() + (RowsAtCompileTime == 1 ? 0 : index),
377 m_startCol.value() + (RowsAtCompileTime == 1 ? index : 0));
378 }
379
380 inline const Scalar coeff(Index index) const
381 {
382 return m_matrix.coeff(m_startRow.value() + (RowsAtCompileTime == 1 ? 0 : index),
383 m_startCol.value() + (RowsAtCompileTime == 1 ? index : 0));
384 }
385
386 inline const XprType& nestedExpression() const { return m_matrix; }
387 inline XprType& nestedExpression() { return m_matrix; }
388 Index startRow() const { return m_startRow.value(); }
389 Index startCol() const { return m_startCol.value(); }
390 Index blockRows() const { return m_blockRows.value(); }
391 Index blockCols() const { return m_blockCols.value(); }
392
393 protected:
394// friend class internal::GenericSparseBlockInnerIteratorImpl<XprType,BlockRows,BlockCols,InnerPanel>;
395 friend struct internal::unary_evaluator<Block<XprType,BlockRows,BlockCols,InnerPanel>, internal::IteratorBased, Scalar >;
396
397 Index nonZeros() const { return Dynamic; }
398
404
405 protected:
406 // Disable assignment with clear error message.
407 // Note that simply removing operator= yields compilation errors with ICC+MSVC
408 template<typename T>
410 {
411 EIGEN_STATIC_ASSERT(sizeof(T)==0, THIS_SPARSE_BLOCK_SUBEXPRESSION_IS_READ_ONLY);
412 return *this;
413 }
414
415};
416
417namespace internal {
418
419template<typename ArgType, int BlockRows, int BlockCols, bool InnerPanel>
421 : public evaluator_base<Block<ArgType,BlockRows,BlockCols,InnerPanel> >
422{
423 class InnerVectorInnerIterator;
424 class OuterVectorInnerIterator;
425 public:
427 typedef typename XprType::StorageIndex StorageIndex;
428 typedef typename XprType::Scalar Scalar;
429
430 enum {
431 IsRowMajor = XprType::IsRowMajor,
432
433 OuterVector = (BlockCols==1 && ArgType::IsRowMajor)
434 | // FIXME | instead of || to please GCC 4.4.0 stupid warning "suggest parentheses around &&".
435 // revert to || as soon as not needed anymore.
436 (BlockRows==1 && !ArgType::IsRowMajor),
437
439 Flags = XprType::Flags
440 };
441
443
444 explicit unary_evaluator(const XprType& op)
445 : m_argImpl(op.nestedExpression()), m_block(op)
446 {}
447
448 inline Index nonZerosEstimate() const {
449 const Index nnz = m_block.nonZeros();
450 if(nnz < 0) {
451 // Scale the non-zero estimate for the underlying expression linearly with block size.
452 // Return zero if the underlying block is empty.
453 const Index nested_sz = m_block.nestedExpression().size();
454 return nested_sz == 0 ? 0 : m_argImpl.nonZerosEstimate() * m_block.size() / nested_sz;
455 }
456 return nnz;
457 }
458
459 protected:
461
464};
465
466template<typename ArgType, int BlockRows, int BlockCols, bool InnerPanel>
467class unary_evaluator<Block<ArgType,BlockRows,BlockCols,InnerPanel>, IteratorBased>::InnerVectorInnerIterator
468 : public EvalIterator
469{
470 // NOTE MSVC fails to compile if we don't explicitely "import" IsRowMajor from unary_evaluator
471 // because the base class EvalIterator has a private IsRowMajor enum too. (bug #1786)
472 // NOTE We cannot call it IsRowMajor because it would shadow unary_evaluator::IsRowMajor
473 enum { XprIsRowMajor = unary_evaluator::IsRowMajor };
474 const XprType& m_block;
475 Index m_end;
476public:
477
479 : EvalIterator(aEval.m_argImpl, outer + (XprIsRowMajor ? aEval.m_block.startRow() : aEval.m_block.startCol())),
480 m_block(aEval.m_block),
481 m_end(XprIsRowMajor ? aEval.m_block.startCol()+aEval.m_block.blockCols() : aEval.m_block.startRow()+aEval.m_block.blockRows())
482 {
483 while( (EvalIterator::operator bool()) && (EvalIterator::index() < (XprIsRowMajor ? m_block.startCol() : m_block.startRow())) )
484 EvalIterator::operator++();
485 }
486
487 inline StorageIndex index() const { return EvalIterator::index() - convert_index<StorageIndex>(XprIsRowMajor ? m_block.startCol() : m_block.startRow()); }
488 inline Index outer() const { return EvalIterator::outer() - (XprIsRowMajor ? m_block.startRow() : m_block.startCol()); }
489 inline Index row() const { return EvalIterator::row() - m_block.startRow(); }
490 inline Index col() const { return EvalIterator::col() - m_block.startCol(); }
491
492 inline operator bool() const { return EvalIterator::operator bool() && EvalIterator::index() < m_end; }
493};
494
495template<typename ArgType, int BlockRows, int BlockCols, bool InnerPanel>
496class unary_evaluator<Block<ArgType,BlockRows,BlockCols,InnerPanel>, IteratorBased>::OuterVectorInnerIterator
497{
498 // NOTE see above
499 enum { XprIsRowMajor = unary_evaluator::IsRowMajor };
500 const unary_evaluator& m_eval;
501 Index m_outerPos;
502 const Index m_innerIndex;
503 Index m_end;
504 EvalIterator m_it;
505public:
506
508 : m_eval(aEval),
509 m_outerPos( (XprIsRowMajor ? aEval.m_block.startCol() : aEval.m_block.startRow()) ),
510 m_innerIndex(XprIsRowMajor ? aEval.m_block.startRow() : aEval.m_block.startCol()),
511 m_end(XprIsRowMajor ? aEval.m_block.startCol()+aEval.m_block.blockCols() : aEval.m_block.startRow()+aEval.m_block.blockRows()),
512 m_it(m_eval.m_argImpl, m_outerPos)
513 {
515 eigen_assert(outer==0);
516
517 while(m_it && m_it.index() < m_innerIndex) ++m_it;
518 if((!m_it) || (m_it.index()!=m_innerIndex))
519 ++(*this);
520 }
521
522 inline StorageIndex index() const { return convert_index<StorageIndex>(m_outerPos - (XprIsRowMajor ? m_eval.m_block.startCol() : m_eval.m_block.startRow())); }
523 inline Index outer() const { return 0; }
524 inline Index row() const { return XprIsRowMajor ? 0 : index(); }
525 inline Index col() const { return XprIsRowMajor ? index() : 0; }
526
527 inline Scalar value() const { return m_it.value(); }
528 inline Scalar& valueRef() { return m_it.valueRef(); }
529
530 inline OuterVectorInnerIterator& operator++()
531 {
532 // search next non-zero entry
533 while(++m_outerPos<m_end)
534 {
535 // Restart iterator at the next inner-vector:
536 m_it.~EvalIterator();
537 ::new (&m_it) EvalIterator(m_eval.m_argImpl, m_outerPos);
538 // search for the key m_innerIndex in the current outer-vector
539 while(m_it && m_it.index() < m_innerIndex) ++m_it;
540 if(m_it && m_it.index()==m_innerIndex) break;
541 }
542 return *this;
543 }
544
545 inline operator bool() const { return m_outerPos < m_end; }
546};
547
548template<typename _Scalar, int _Options, typename _StorageIndex, int BlockRows, int BlockCols>
549struct unary_evaluator<Block<SparseMatrix<_Scalar, _Options, _StorageIndex>,BlockRows,BlockCols,true>, IteratorBased>
550 : evaluator<SparseCompressedBase<Block<SparseMatrix<_Scalar, _Options, _StorageIndex>,BlockRows,BlockCols,true> > >
551{
554 explicit unary_evaluator(const XprType &xpr) : Base(xpr) {}
555};
556
557template<typename _Scalar, int _Options, typename _StorageIndex, int BlockRows, int BlockCols>
558struct unary_evaluator<Block<const SparseMatrix<_Scalar, _Options, _StorageIndex>,BlockRows,BlockCols,true>, IteratorBased>
559 : evaluator<SparseCompressedBase<Block<const SparseMatrix<_Scalar, _Options, _StorageIndex>,BlockRows,BlockCols,true> > >
560{
563 explicit unary_evaluator(const XprType &xpr) : Base(xpr) {}
564};
565
566} // end namespace internal
567
568
569} // end namespace Eigen
570
571#endif // EIGEN_SPARSE_BLOCK_H
int i
Definition BiCGSTAB_step_by_step.cpp:9
#define eigen_internal_assert(x)
Definition Macros.h:1043
#define EIGEN_UNUSED_VARIABLE(var)
Definition Macros.h:1076
#define eigen_assert(x)
Definition Macros.h:1037
#define EIGEN_STRONG_INLINE
Definition Macros.h:917
m col(1)
m row(1)
#define EIGEN_SPARSE_PUBLIC_INTERFACE(Derived)
Definition SparseUtil.h:43
#define EIGEN_STATIC_ASSERT_VECTOR_ONLY(TYPE)
Definition StaticAssert.h:142
#define EIGEN_STATIC_ASSERT(CONDITION, MSG)
Definition StaticAssert.h:127
float * p
Definition Tutorial_Map_using.cpp:9
int rows
Definition Tutorial_commainit_02.cpp:1
int cols
Definition Tutorial_commainit_02.cpp:1
SCALAR Scalar
Definition bench_gemm.cpp:46
SparseMatrix< _Scalar, _Options, _StorageIndex > SparseMatrixType
Definition SparseBlock.h:292
internal::sparse_matrix_block_impl< SparseMatrixType, BlockRows, BlockCols > Base
Definition SparseBlock.h:293
BlockImpl(SparseMatrixType &xpr, Index startRow, Index startCol, Index blockRows, Index blockCols)
Definition SparseBlock.h:298
const Scalar coeff(Index index) const
Definition SparseBlock.h:380
internal::ref_selector< XprType >::non_const_type m_matrix
Definition SparseBlock.h:399
const internal::variable_if_dynamic< Index, XprType::ColsAtCompileTime==1 ? 0 :Dynamic > m_startCol
Definition SparseBlock.h:401
BlockImpl(XprType &xpr, Index startRow, Index startCol, Index blockRows, Index blockCols)
Definition SparseBlock.h:357
const internal::variable_if_dynamic< Index, RowsAtCompileTime > m_blockRows
Definition SparseBlock.h:402
const internal::variable_if_dynamic< Index, ColsAtCompileTime > m_blockCols
Definition SparseBlock.h:403
const Scalar coeff(Index row, Index col) const
Definition SparseBlock.h:369
BlockImpl & operator=(const T &)
Definition SparseBlock.h:409
const XprType & nestedExpression() const
Definition SparseBlock.h:386
Scalar & coeffRef(Index index)
Definition SparseBlock.h:374
Scalar & coeffRef(Index row, Index col)
Definition SparseBlock.h:364
const internal::variable_if_dynamic< Index, XprType::RowsAtCompileTime==1 ? 0 :Dynamic > m_startRow
Definition SparseBlock.h:400
XprType & nestedExpression()
Definition SparseBlock.h:65
BlockImpl & operator=(const T &)
Definition SparseBlock.h:81
Index startCol() const
Definition SparseBlock.h:67
EIGEN_STRONG_INLINE Index rows() const
Definition SparseBlock.h:39
const internal::variable_if_dynamic< Index, OuterSize > m_outerSize
Definition SparseBlock.h:75
const Scalar coeff(Index row, Index col) const
Definition SparseBlock.h:54
internal::ref_selector< XprType >::non_const_type m_matrix
Definition SparseBlock.h:73
EIGEN_STRONG_INLINE Index cols() const
Definition SparseBlock.h:40
BlockImpl(XprType &xpr, Index startRow, Index startCol, Index blockRows, Index blockCols)
Definition SparseBlock.h:35
Index blockCols() const
Definition SparseBlock.h:69
const XprType & nestedExpression() const
Definition SparseBlock.h:64
SparseMatrixBase< BlockType > Base
Definition SparseBlock.h:26
Index blockRows() const
Definition SparseBlock.h:68
Index nonZeros() const
Definition SparseBlock.h:42
Index startRow() const
Definition SparseBlock.h:66
const Scalar coeff(Index index) const
Definition SparseBlock.h:59
internal::sparse_matrix_block_impl< SparseMatrixType, BlockRows, BlockCols > Base
Definition SparseBlock.h:312
BlockImpl(SparseMatrixType &xpr, Index startRow, Index startCol, Index blockRows, Index blockCols)
Definition SparseBlock.h:317
const SparseMatrix< _Scalar, _Options, _StorageIndex > SparseMatrixType
Definition SparseBlock.h:311
Definition Block.h:67
Expression of a fixed-size or dynamic-size block.
Definition Block.h:105
Common base class for sparse [compressed]-{row|column}-storage format.
Definition SparseCompressedBase.h:38
Base class of any sparse matrices or sparse expressions.
Definition SparseMatrixBase.h:28
internal::traits< Derived >::StorageIndex StorageIndex
Definition SparseMatrixBase.h:43
const Derived & derived() const
Definition SparseMatrixBase.h:143
@ IsVectorAtCompileTime
Definition SparseMatrixBase.h:84
internal::traits< Block< XprType, BlockRows, BlockCols, true > >::Scalar Scalar
Definition SparseMatrixBase.h:31
static StorageIndex convert_index(const Index idx)
Definition SparseMatrixBase.h:389
A versatible sparse matrix representation.
Definition SparseMatrix.h:98
Definition XprHelper.h:110
Scalar & coeffRef(Index row, Index col)
Definition SparseBlock.h:241
StorageIndex * innerNonZeroPtr()
Definition SparseBlock.h:236
BlockType & operator=(const SparseMatrixBase< OtherDerived > &other)
Definition SparseBlock.h:120
Scalar * valuePtr()
Definition SparseBlock.h:221
Index blockRows() const
Definition SparseBlock.h:273
internal::ref_selector< SparseMatrixType >::non_const_type m_matrix
Definition SparseBlock.h:278
@ OuterSize
Definition SparseBlock.h:108
BlockType & operator=(const BlockType &other)
Definition SparseBlock.h:214
const SparseMatrixType & nestedExpression() const
Definition SparseBlock.h:269
const Scalar coeff(Index index) const
Definition SparseBlock.h:251
@ IsRowMajor
Definition SparseBlock.h:104
SparseMatrixType & nestedExpression()
Definition SparseBlock.h:270
sparse_matrix_block_impl(SparseMatrixType &xpr, Index i)
Definition SparseBlock.h:111
const Scalar * valuePtr() const
Definition SparseBlock.h:219
const StorageIndex * outerIndexPtr() const
Definition SparseBlock.h:229
const internal::variable_if_dynamic< Index, OuterSize > m_outerSize
Definition SparseBlock.h:280
EIGEN_STRONG_INLINE Index cols() const
Definition SparseBlock.h:267
Base::IndexVector IndexVector
Definition SparseBlock.h:107
StorageIndex * outerIndexPtr()
Definition SparseBlock.h:231
Index startCol() const
Definition SparseBlock.h:272
const Scalar & lastCoeff() const
Definition SparseBlock.h:256
const Scalar coeff(Index row, Index col) const
Definition SparseBlock.h:246
Index blockCols() const
Definition SparseBlock.h:274
const StorageIndex * innerNonZeroPtr() const
Definition SparseBlock.h:234
StorageIndex * innerIndexPtr()
Definition SparseBlock.h:226
Index startRow() const
Definition SparseBlock.h:271
Index m_outerStart
Definition SparseBlock.h:279
EIGEN_STRONG_INLINE Index rows() const
Definition SparseBlock.h:266
sparse_matrix_block_impl(SparseMatrixType &xpr, Index startRow, Index startCol, Index blockRows, Index blockCols)
Definition SparseBlock.h:115
const StorageIndex * innerIndexPtr() const
Definition SparseBlock.h:224
bool isCompressed() const
Definition SparseBlock.h:239
EIGEN_STRONG_INLINE OuterVectorInnerIterator(const unary_evaluator &aEval, Index outer)
Definition SparseBlock.h:507
EIGEN_STRONG_INLINE InnerVectorInnerIterator(const unary_evaluator &aEval, Index outer)
Definition SparseBlock.h:478
Map< Matrix< T, Dynamic, Dynamic, ColMajor >, 0, OuterStride<> > matrix(T *data, int rows, int cols, int stride)
Definition common.h:110
set noclip points set clip one set noclip two set bar set border lt lw set xdata set ydata set zdata set x2data set y2data set boxwidth set dummy y set format x g set format y g set format x2 g set format y2 g set format z g set angles radians set nogrid set key title set key left top Right noreverse box linetype linewidth samplen spacing width set nolabel set noarrow set nologscale set logscale x set set pointsize set encoding default set nopolar set noparametric set set set set surface set nocontour set clabel set mapping cartesian set nohidden3d set cntrparam order set cntrparam linear set cntrparam levels auto set cntrparam points set size set set xzeroaxis lt lw set x2zeroaxis lt lw set yzeroaxis lt lw set y2zeroaxis lt lw set tics in set ticslevel set tics set mxtics default set mytics default set mx2tics default set my2tics default set xtics border mirror norotate autofreq set ytics border mirror norotate autofreq set ztics border nomirror norotate autofreq set nox2tics set noy2tics set timestamp bottom norotate offset
Definition gnuplot_common_settings.hh:64
EIGEN_DEVICE_FUNC IndexDest convert_index(const IndexSrc &idx)
Definition XprHelper.h:31
EIGEN_DEVICE_FUNC void smart_copy(const T *start, const T *end, T *target)
Definition Memory.h:515
void smart_memmove(const T *start, const T *end, T *target)
Definition Memory.h:539
Namespace containing all symbols from the Eigen library.
Definition bench_norm.cpp:85
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition Meta.h:74
const int Dynamic
Definition Constants.h:22
Definition BandTriangularSolver.h:13
CwiseBinaryOp< internal::scalar_sum_op< double, double >, const CpyMatrixXd, const CpyMatrixXd > XprType
Definition nestbyvalue.cpp:15
Eigen::Index Index
The interface type of indices.
Definition EigenBase.h:39
Definition Constants.h:510
Definition Constants.h:545
Definition CoreEvaluators.h:111
Definition CoreEvaluators.h:91
Definition ForwardDeclarations.h:17
internal::conditional< OuterVector, OuterVectorInnerIterator, InnerVectorInnerIterator >::type InnerIterator
Definition SparseBlock.h:442
Block< ArgType, BlockRows, BlockCols, InnerPanel > XprType
Definition SparseBlock.h:426
Block< SparseMatrix< _Scalar, _Options, _StorageIndex >, BlockRows, BlockCols, true > XprType
Definition SparseBlock.h:552
Block< const SparseMatrix< _Scalar, _Options, _StorageIndex >, BlockRows, BlockCols, true > XprType
Definition SparseBlock.h:561
Definition CoreEvaluators.h:65
std::ptrdiff_t j
Definition tut_arithmetic_redux_minmax.cpp:2