2012-12-15 129 views
2

我遇到了我的矩阵类的问题,我无法找到解决方案。(C++)模板矩阵类中的矩阵乘法

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

我可以向谷歌建议“矩阵模板C++”吗? - http://www.drdobbs.com/a-c-matrix-template-class/184403323?pgno=2 – SChepurin

回答

1

使用模板成员函数整数模板参数:

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 */ 
    } 
    ... 
}; 

此外,不要通过引用返回值。

+0

如何在乘法中指定模板参数?在我的例子中,Matrix matrix = A * B;将这项工作没有指定N? – Gaudo

+1

是的,它会工作,而不指定N.编译器通过查看B的类型来计算出N是什么(它被称为模板参数推演。) – user763305

+0

哦,我不知道这一点,谢谢:) – Gaudo

2

您可以看看this Example,但不是执行三重循环(非常低效),而是委托给英特尔MKL dgemm

注意矩阵类型也使用operator*()是一个坏主意,因为您需要通过值返回结果,除非您确定具有已启用的命名返回值优化(NRVO)的编译器并测试它的工作原理。也就是说,你不想按照价值返回一个矩阵,并导致非常昂贵的矩阵复制。这就是为什么我在执行我选择定义的方法multiply代替超载operator*()

一个有效的替代operator*()将让你用它像这样来定义operator*=(),而相乘的结果存储到A直接:

A *= B; // or A = A*B 
+0

非常有趣!推理一段时间后,我想我会像你一样做。乘法对我来说似乎也是一个更好的选择。谢谢。 – Gaudo