在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;
但是,在这种情况下,编译器会抱怨:
FLENS作者提供了有关implementing your custom type of matrix的指南,但我在这里使用的是已经定义的矩阵类型-flens::GeMatrix。
最重要的是,问题是:如何在FLENS中实现一个矩阵,该矩阵可以操纵内部缓冲区和像
m3 = m1 * m2
这样的高层交互? 最佳答案
无需编写您自己的类,FLENS已经提供了以下功能:
typedef FullStorageView<double, ColMajor> FSView;
typedef GeMatrix<FSView> GeMatrixView;
GeMatrixView A = FSView(numRows, numCols, data, ldA);
在这里,数据是指向您分配的内存的指针。本教程中对此进行了详细说明。此外,还有一个邮件列表,可以很快速地回答问题。
关于c++ - 定制的FLENS存储,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15174298/