17#ifndef __B2MATRIX_STRUCTURED_H__ 
   18#define __B2MATRIX_STRUCTURED_H__ 
   20#include "b2linear_algebra_def.H" 
   22namespace b2000::b2linalg {
 
   24template <
typename MTYPE>
 
   25struct Mstructured_constref {
 
   26    using base = Mstructured_constref;
 
   27    using const_base = Mstructured_constref;
 
   28    using copy = 
typename MTYPE::copy;
 
   31template <
typename T, 
typename MTYPE>
 
   32class Matrix<T, Mstructured_constref<MTYPE>> {
 
   34    Matrix() : m(Matrix<T, MTYPE>::null), s(0), s2(0), index(0), index2(0) {}
 
   36    Matrix(
size_t size_, 
const size_t* index_, 
const Matrix<T, MTYPE>& m_)
 
   37        : m(m_), s(size_), s2(size_), index(index_), index2(0) {}
 
   40          size_t size_1, 
size_t size_2, 
const size_t* index1_, 
const size_t* index2_,
 
   41          const Matrix<T, MTYPE>& m_)
 
   42        : m(m_), s(size_1), s2(size_2), index(index1_), index2(index2_) {}
 
   44    Matrix(
const Matrix& m_) : m(m_.m), s(m_.s), s2(m_.s2), index(m_.index), index2(m_.index2) {}
 
   46    std::pair<size_t, size_t> size()
 const { 
return std::pair<size_t, size_t>(s, s2); }
 
   48    size_t size1()
 const { 
return s; }
 
   50    size_t size2()
 const { 
return s2; }
 
   52    size_t esize()
 const { 
return s * (s + 1) / 2; }
 
   54    T operator()(
size_t i, 
size_t j)
 const {
 
   55        const size_t* ii = std::find(index, index + m.size1(), i);
 
   56        if (ii == index + m.size1()) { 
return 0; }
 
   59            jj = std::find(index2, index2 + m.size1(), j);
 
   60            if (jj == index2 + m.size1()) { 
return 0; }
 
   62            jj = std::find(index, index + m.size1(), j);
 
   63            if (jj == index + m.size1()) { 
return 0; }
 
   65        return m(ii - index, jj - index);
 
   69    const Matrix<T, MTYPE> m;
 
   77template <
typename T, 
typename MTYPE>
 
   78Matrix<T, Mstructured_constref<typename MTYPE::const_base>> StructuredMatrix(
 
   79      size_t size, 
const Index& index, 
const Matrix<T, MTYPE>& m) {
 
   80    if (index.size() != m.size1()) {
 
   81        Exception() << 
"The index size differ from the matrix size." << 
THROW;
 
   83    return Matrix<T, Mstructured_constref<typename MTYPE::const_base>>(size, &index[0], m);
 
   86template <
typename T, 
typename MTYPE>
 
   87Matrix<T, Mstructured_constref<typename MTYPE::const_base>> StructuredMatrix(
 
   88      size_t size1, 
size_t size2, 
const Index& index1, 
const Index& index2,
 
   89      const Matrix<T, MTYPE>& m) {
 
   90    if (index1.size() != m.size1() && index2.size() != m.size2()) {
 
   91        Exception() << 
"The index size differ from the matrix size." << 
THROW;
 
   93    return Matrix<T, Mstructured_constref<typename MTYPE::const_base>>(
 
   94          size1, size2, &index1[0], &index2[0], m);
 
#define THROW
Definition b2exception.H:198