25 #ifndef EIGEN_SPARSE_BLOCK_H
26 #define EIGEN_SPARSE_BLOCK_H
31 template<
typename MatrixType,
int Size>
32 struct traits<SparseInnerVectorSet<MatrixType, Size> >
37 typedef MatrixXpr XprKind;
40 Flags = MatrixType::Flags,
41 RowsAtCompileTime = IsRowMajor ? Size : MatrixType::RowsAtCompileTime,
42 ColsAtCompileTime = IsRowMajor ? MatrixType::ColsAtCompileTime : Size,
43 MaxRowsAtCompileTime = RowsAtCompileTime,
44 MaxColsAtCompileTime = ColsAtCompileTime,
45 CoeffReadCost = MatrixType::CoeffReadCost
50 template<
typename MatrixType,
int Size>
56 enum { IsRowMajor = internal::traits<SparseInnerVectorSet>::IsRowMajor };
59 class InnerIterator: public MatrixType::InnerIterator
63 : MatrixType::InnerIterator(xpr.m_matrix, xpr.m_outerStart + outer), m_outer(outer)
65 inline Index
row()
const {
return IsRowMajor ? m_outer : this->index(); }
66 inline Index
col()
const {
return IsRowMajor ? this->index() : m_outer; }
70 class ReverseInnerIterator:
public MatrixType::ReverseInnerIterator
73 inline ReverseInnerIterator(
const SparseInnerVectorSet& xpr, Index outer)
74 : MatrixType::ReverseInnerIterator(xpr.m_matrix, xpr.m_outerStart + outer), m_outer(outer)
76 inline Index
row()
const {
return IsRowMajor ? m_outer : this->index(); }
77 inline Index
col()
const {
return IsRowMajor ? this->index() : m_outer; }
83 : m_matrix(matrix), m_outerStart(outerStart), m_outerSize(outerSize)
85 eigen_assert( (outerStart>=0) && ((outerStart+outerSize)<=matrix.outerSize()) );
89 : m_matrix(matrix), m_outerStart(outer), m_outerSize(Size)
92 eigen_assert( (outer>=0) && (outer<matrix.outerSize()) );
122 template<
typename _Scalar,
int _Options,
typename _Index,
int Size>
124 :
public SparseMatrixBase<SparseInnerVectorSet<SparseMatrix<_Scalar, _Options, _Index>, Size> >
129 enum { IsRowMajor = internal::traits<SparseInnerVectorSet>::IsRowMajor };
132 class InnerIterator: public MatrixType::InnerIterator
136 : MatrixType::InnerIterator(xpr.m_matrix, xpr.m_outerStart + outer), m_outer(outer)
138 inline Index
row()
const {
return IsRowMajor ? m_outer : this->index(); }
139 inline Index
col()
const {
return IsRowMajor ? this->index() : m_outer; }
143 class ReverseInnerIterator:
public MatrixType::ReverseInnerIterator
146 inline ReverseInnerIterator(
const SparseInnerVectorSet& xpr, Index outer)
147 : MatrixType::ReverseInnerIterator(xpr.m_matrix, xpr.m_outerStart + outer), m_outer(outer)
149 inline Index
row()
const {
return IsRowMajor ? m_outer : this->index(); }
150 inline Index
col()
const {
return IsRowMajor ? this->index() : m_outer; }
156 : m_matrix(matrix), m_outerStart(outerStart), m_outerSize(outerSize)
162 : m_matrix(matrix), m_outerStart(outer), m_outerSize(Size)
168 template<
typename OtherDerived>
171 typedef typename internal::remove_all<typename MatrixType::Nested>::type _NestedMatrixType;
172 _NestedMatrixType& matrix =
const_cast<_NestedMatrixType&
>(m_matrix);;
181 Index nnz_previous = nonZeros();
182 Index free_size = Index(matrix.data().allocatedSize()) + nnz_previous;
183 Index nnz_head = m_outerStart==0 ? 0 : matrix.outerIndexPtr()[m_outerStart];
184 Index tail = m_matrix.outerIndexPtr()[m_outerStart+m_outerSize.value()];
185 Index nnz_tail = matrix.nonZeros() - tail;
192 std::memcpy(&newdata.value(0), &m_matrix.data().value(0), nnz_head*
sizeof(
Scalar));
193 std::memcpy(&newdata.index(0), &m_matrix.data().index(0), nnz_head*
sizeof(Index));
195 std::memcpy(&newdata.value(nnz_head), &tmp.
data().value(0), nnz*
sizeof(
Scalar));
196 std::memcpy(&newdata.index(nnz_head), &tmp.
data().index(0), nnz*
sizeof(Index));
198 std::memcpy(&newdata.value(nnz_head+nnz), &matrix.data().value(tail), nnz_tail*
sizeof(
Scalar));
199 std::memcpy(&newdata.index(nnz_head+nnz), &matrix.data().index(tail), nnz_tail*
sizeof(Index));
201 matrix.data().swap(newdata);
206 matrix.data().resize(nnz_head + nnz + nnz_tail);
210 std::memcpy(&matrix.data().value(nnz_head+nnz), &matrix.data().value(tail), nnz_tail*
sizeof(
Scalar));
211 std::memcpy(&matrix.data().index(nnz_head+nnz), &matrix.data().index(tail), nnz_tail*
sizeof(Index));
215 for(Index i=nnz_tail-1; i>=0; --i)
217 matrix.data().value(nnz_head+nnz+i) = matrix.data().value(tail+i);
218 matrix.data().index(nnz_head+nnz+i) = matrix.data().index(tail+i);
222 std::memcpy(&matrix.data().value(nnz_head), &tmp.
data().value(0), nnz*
sizeof(
Scalar));
223 std::memcpy(&matrix.data().index(nnz_head), &tmp.
data().index(0), nnz*
sizeof(Index));
228 for(Index k=0; k<m_outerSize.value(); ++k)
230 matrix.outerIndexPtr()[m_outerStart+k] =
p;
233 std::ptrdiff_t offset = nnz - nnz_previous;
234 for(Index k = m_outerStart + m_outerSize.value(); k<=matrix.outerSize(); ++k)
236 matrix.outerIndexPtr()[k] += offset;
248 {
return m_matrix.valuePtr() + m_matrix.outerIndexPtr()[m_outerStart]; }
250 {
return m_matrix.
const_cast_derived().valuePtr() + m_matrix.outerIndexPtr()[m_outerStart]; }
252 inline const Index* innerIndexPtr()
const
253 {
return m_matrix.innerIndexPtr() + m_matrix.outerIndexPtr()[m_outerStart]; }
254 inline Index* innerIndexPtr()
255 {
return m_matrix.const_cast_derived().innerIndexPtr() + m_matrix.outerIndexPtr()[m_outerStart]; }
257 inline const Index* outerIndexPtr()
const
258 {
return m_matrix.outerIndexPtr() + m_outerStart; }
259 inline Index* outerIndexPtr()
260 {
return m_matrix.const_cast_derived().outerIndexPtr() + m_outerStart; }
262 Index nonZeros()
const
264 if(m_matrix.isCompressed())
265 return std::size_t(m_matrix.outerIndexPtr()[m_outerStart+m_outerSize.value()])
266 - std::size_t(m_matrix.outerIndexPtr()[m_outerStart]);
267 else if(m_outerSize.value()==0)
277 if(m_matrix.isCompressed())
278 return m_matrix.valuePtr()[m_matrix.outerIndexPtr()[m_outerStart+1]-1];
280 return m_matrix.valuePtr()[m_matrix.outerIndexPtr()[m_outerStart]+m_matrix.innerNonZeroPtr()[m_outerStart]-1];
303 template<
typename Derived>
307 return innerVector(i);
312 template<
typename Derived>
316 return innerVector(i);
320 template<
typename Derived>
324 return innerVector(i);
329 template<
typename Derived>
333 return innerVector(i);
339 template<
typename Derived>
346 template<
typename Derived>
351 template<
typename Derived>
355 return innerVectors(start, size);
360 template<
typename Derived>
364 return innerVectors(start, size);
368 template<
typename Derived>
372 return innerVectors(start, size);
377 template<
typename Derived>
381 return innerVectors(start, size);
389 template<
typename Derived>
396 template<
typename Derived>
402 #endif // EIGEN_SPARSE_BLOCK_H