我遇到了矩阵类的问题,我找不到解决方案。
Matrix = ROWSxCOLUMNS
Let A be a 3x4 matrix
Let B be a 4x5 matrix
操作AxB
(仅当A的列与B的行匹配时才定义)导致3x5 matrix
。
我想创建一个模板化的类来实现这一点。
Matrix<int,3,4> A;
Matrix<int,4,5> B;
Matrix<int,3,5> matrix = A*B;
我的代码:
template <class T, unsigned int ROWS, unsigned int COLUMNS>
class Matrix {
public:
/* blabla */
const Matrix<T, ROWS, /* ? */ >&
operator*(const Matrix<T, COLUMNS, /* ? */ >& matrix) const
{
/* multiplication */
}
/* blabla */
};
我不知道在/* ? */
部分插入什么内容。
有没有办法让编译器接受任何无符号整数值?我应该以不同的方式重写代码吗?
注意:我正在为学术目的创建这个类,我不在乎是否已经有这样的库。
答案 0 :(得分:3)
使用带有整数模板参数的模板成员函数:
template<class T, unsigned int ROWS, unsigned int COLUMNS>
class Matrix {
public:
...
template<unsigned int N>
Matrix<T, ROWS, N>
operator*(const Matrix<T, COLUMNS, N>& matrix) const
{
/* multiplication */
}
...
};
另外,不要通过引用返回值。
答案 1 :(得分:2)
你可以看一下this Example,但不是做三重循环(非常低效),而是委托给英特尔MKL dgemm
。
另请注意,使用operator*()
作为矩阵类型是一个坏主意,因为您需要按值返回结果,除非您确定您的编译器具有已启用的命名返回值优化(NRVO)并已经过测试有用。也就是说,您不希望按值返回矩阵并导致非常昂贵的矩阵复制。这就是为什么在我的实现中我选择定义方法multiply
而不是重载operator*()
operator*()
的有效替代方法是定义operator*=()
,以便您像这样使用它,并且乘法的结果直接存储到A中:
A *= B; // or A = A*B