【发布时间】:2019-05-01 17:36:59
【问题描述】:
我正在为我的大学 C++ 课程制作一个矩阵计算器,但我不确定如何为其设计课程。我的问题是该程序的一个特征必须是稀疏和密集矩阵应该以不同的方式存储以提高内存效率(密集为典型的二维数组或向量,例如稀疏的 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;
}
我可能正在考虑将 2D 数组与抽象方法 setValue() 一起添加到“MatrixWrapper”,然后每次都使用该方法设置该数组的值,然后在“MatrixSparse”和“MatrixDense”中工作使用“MatrixWrapper”中的那个二维数组,但我不确定如何实现它,或者即使这是正确的方法。
【问题讨论】:
-
旁注:
vector< vector<double> > matrix;的缓存行为可能非常糟糕。考虑使用单个vector并自己执行 2D1D 数学运算。
标签: c++ oop inheritance