我目前有一个matrix
类,std::vector<std::vector<double>>
。我还有一个vector
类(不要与stl的向量混淆,它更多是数学的1,2,3维度向量),这是一个std::vector<double>
。
在我完成这两个课程后,我遇到了问题,因为现在我想做 tmp_vector * tmp_matrix ,但由于它们的类型不同,我无法做到。
所以我的问题是:
什么是合适的设计选择?
matrix
和vector
(比如说matvec
类,这只是一个空类)
或matrix
类继承向量)答案 0 :(得分:3)
我应该从同一个类继承矩阵和向量吗?
我认为这样的设计不会帮助你进行乘法运算。
可能是。但如果我是你,如果一个原因是乘法运算的实现,我就不会这样做。我应该从矩阵类继承向量吗?
对于(矢量,矩阵)和(矩阵,矢量)组合,我建议您只需重载 operator*
。我相信这是解决问题最自然的方式。
答案 1 :(得分:2)
通常,实现将(数学)向量和矩阵表示为来自stl向量或向量向量的派生类的类不是非常有效。在数值库中主要完成的是具有不从任何东西派生的Matrix类,但是包含指向非常简单且直的一维数组的指针。双打,根本不使用stl。
通过适当地重载()运算符来实现作为多维矩阵的行为,以进行正确的索引计算。
矢量很可能是具有一列或一行的矩阵,因为只要参数列表不同,就可以有多个()的重载。这将允许您使用一个索引来处理Vector中的元素。
您可以为这些类重载+, - 和*,并为它们提供转换构造函数。不要忘记添加析构函数来释放内存和复制构造函数,以防止两个这样的矩阵共享相同的内存。
出于同样的原因,您还需要重载赋值运算符。它应该释放分配左侧的旧内容并重新分配适当的内存量。