我正在将矩阵计算器作为大学C ++类的项目,但我不确定如何为其设计类。我的问题是该程序的一个特征是必须以不同的方式存储稀疏和密集的矩阵以提高内存效率(例如密集的2D数组或向量,例如CSR格式的稀疏矩阵),但是我需要处理两种类型都以相同的方式。
到目前为止,我在想类似抽象类'MatrixWrapper'的事情,该类应该包含用于加,乘,GEM等的所有共享算法。然后具有类“ MatrixDense”和“ MatrixSparse”,它们都将从“ MatrixWrapper”继承,因此具有相同的接口(如下面的代码所示)。但这就是我被困住的地方,因为当我尝试在“ MatrixWrapper”中实现算法时,用这种方法我不知道我要使用两种矩阵中的哪一种。我只是不确定如何解决这个问题甚至可能是正确的方法。
class MatrixWrapper {
public:
// shared algorithms
/* for example
void addMatrix ( const ??? &x ) {
...
}
*/
}
class MatrixDense : public MatrixWrapper {
public:
//constructor, destructor, ...
private:
vector< vector<double> > matrix;
}
class MatrixSparse : public MatrixWrapper {
public:
//constructor, destructor, ...
private:
struct CSR {
...
};
CSR matrix;
}
我可能正在考虑将二维数组与抽象方法setValue()一起添加到“ MatrixWrapper”中,然后每次使用此方法设置此数组的值,然后在“ MatrixSparse”和“ MatrixDense”中添加它们,然后就可以工作了在“ MatrixWrapper”中使用该2D数组,但是我不确定如何实现该方法,即使这是正确的方法,也不确定。
答案 0 :(得分:1)
使用非成员函数实现所有二进制运算符。全局函数或不相关类中的函数:
// Option 1
void add(
MatrixWrapper& result,
const MatrixWrapper& operand1,
const MatrixWrapper& operand2);
// Option 2
struct WrapperForMatrixOperations // I don't know why you might want this class to exist
{
static // or maybe not static
void add(
MatrixWrapper& result,
const MatrixWrapper& operand1,
const MatrixWrapper& operand2);
};
原因是,您的算法在添加密集和稀疏矩阵时可能会返回“密集”矩阵:
dense + sparse = dense
sparse + sparse = sparse
sparse + dense = dense <- problem!
dense + dense = dense
如果将其实现为非const
成员函数,则无法使用。
您还应该决定如何创建矩阵-也许每个二进制运算都应分配一个新矩阵并由shared_ptr
返回?