1

FLENSでは、「カスタム」ストレージを実装したいと考えています(つまり、実際のデータへのポインターを提供し、ストレージのメモリ管理を担当できるようにするため)。

バッファを管理するマトリックスは、次のように定義されます。

typedef flens::GeMatrix<flens::FullStorage<double, flens::ColMajor> >  M;

後で、次のような行列を使用できます。

M m1;
M m2;
M m3;
/* initialise the matrices */
m3 = m1 * m2;

内部バッファへのアクセスを提供するマトリックスタイプで同じことを行うには、たとえば、FullStorageGhostStorageの実装方法と同じように、内部ポインタの設定を可能にするメソッドを追加して実装できます(完全な実装は長すぎてここに貼り付けられません) :init()

void
init(IndexType numRows, IndexType numCols,
      IndexType firstRow = I::defaultIndexBase,
      IndexType firstCol = I::defaultIndexBase,
      ElementType *p_data = NULL )
{
  _data = p_data;
  _numRows = numRows;
  _numCols = numCols;
  _firstRow = firstRow;
  _firstCol = firstCol;
  ASSERT(_numRows>=0);
  ASSERT(_numCols>=0);
}

このようなタイプを定義した後:

typedef flens::GhostStorage<double, flens::ColMajor> GhostEng;
class MGhost : public flens::GeMatrix<GhostEng>
{
    public:
    void
    init(IndexType numRows, IndexType numCols,
    IndexType firstRow,
    IndexType firstCol,
    ElementType *p_data = NULL )
  {
    engine().init(numRows,numCols,firstRow,firstCol,p_data);
  }

};

上記と同じ操作が可能であると思います。

MGhost mg1;
MGhost mg2;
MGhost mg3;
/* initialise the matrices using the init() method */
mg3 = mg1 * mg2;

ただし、この場合、コンパイラは次のように文句を言います。

'const flens :: MatrixClosure>、flens ::GeMatrix>>'から'constMGhost&'への引数1の既知の変換はありません

FLENSの作成者は、カスタムタイプのマトリックスの実装に関するガイダンスを提供していますが、ここでは、すでに定義されているマトリックスタイプ(flens :: GeMatrix)を使用しています。

結論として、問題は、内部バッファの操作と次のような高レベルの相互作用を可能にするマトリックスをFLENSにどのように実装するかということm3 = m1 * m2です。

4

1 に答える 1