在FLENS 中,我想实现“自定义”存储(也就是说,能够提供指向实际数据的指针并负责存储的内存管理)。
管理其缓冲区的矩阵定义如下,例如:
typedef flens::GeMatrix<flens::FullStorage<double, flens::ColMajor> > M;
稍后,可以使用这样的矩阵:
M m1;
M m2;
M m3;
/* initialise the matrices */
m3 = m1 * m2;
要对允许访问内部缓冲区的矩阵类型做同样的事情,可以实现,比如说,GhostStorage
就像实现FullStorage的方式一样,添加一个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;
但是在这种情况下编译器会抱怨:
没有已知的参数 1 从 'const flens::MatrixClosure >, flens::GeMatrix >' 到 'const MGhost&' 的转换
FLENS 作者提供了有关实现自定义矩阵类型的指导,但我在这里使用了已经定义的矩阵类型 - flens::GeMatrix。
归根结底,问题是:如何在 FLENS 中实现一个矩阵,以允许操纵内部缓冲区和高级交互,例如m3 = m1 * m2
?