C++:矩阵计算器的高级类模型
Posted
技术标签:
【中文标题】C++:矩阵计算器的高级类模型【英文标题】:C++: advanced class model for matrix calculator 【发布时间】: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”中的那个二维数组,但我不确定如何实现它,或者即使这是正确的方法。
【问题讨论】:
使用虚函数怎么样? en.cppreference.com/w/cpp/language/virtual 旁注:vector< vector<double> > matrix;
的缓存行为可能非常糟糕。考虑使用单个 vector
并自己执行 2D1D 数学运算。
【参考方案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
返回它?
【讨论】:
以上是关于C++:矩阵计算器的高级类模型的主要内容,如果未能解决你的问题,请参考以下文章
为啥我必须计算模型矩阵的逆矩阵的转置才能计算反射纹理的法线?
百度地图高级开发:map.getDistance计算多点之间的距离并输入矩阵
R语言构建logistic回归模型并评估模型:计算混淆矩阵并基于混淆矩阵计算AccurayPrecisionRecall(sensitivity)F1Specificity指标