乘以C ++模板矩阵

时间:2011-12-12 18:59:17

标签: c++ templates matrix

我有这样定义的矩阵类:

template<int M, int N, typename T>
class Matrix
{
 typedef Matrix<M, N, T> MTYPE;
 /*...*/
};

我必须实现矩阵乘法,但我不知道如何进行运算符覆盖..

这样的东西
MTYPE operator *(MTYPE& m) { /*...*/ }

只接受N * M矩阵。那我怎么能克服这个问题呢?

2 个答案:

答案 0 :(得分:3)

您需要在类的内部或外部创建模板化运算符。

例如,要将N x M乘以M x M,您可能需要这样做:

  template <int N, int M, class T>
  friend Matrix<N, M, T> operator*(const Matrix<N, M, T> &lhs, const Matrix<M, M, T> &rhs);

其他版本看起来很相似。在课堂外定义它可能是最有用的。

要将(N1 x M)乘以(M x N2),您需要:

 template<int N1, int N2, int M, class T>
 friend Matrix<N1, N2, T> operator*(const Matrix<N1, M, T> &lhs, const Matrix<M, N2, T> &rhs);

答案 1 :(得分:3)

正如评论中指出的那样,* =对非方形矩阵没有意义。

对于一般情况,

template<int M, int N, typename T>
class Matrix
{
    typedef Matrix<M, N, T> MTYPE;
    /*...*/
public:
    template<int L>
    Matrix<M,L,T> operator*(const Matrix<N,L,T>& second) const
    {
       Matrix<M,L,T> result;
       for(...)
           for(...)
               for(...)
                   // ...
       return result;
    }
};

或者,如果您愿意,可以使用带有两个参数的自由函数运算符*(以及模板参数M,N,L和T),并使其成为矩阵类的朋友。