繁体   English   中英

(C ++)模板化Matrix类中的矩阵乘法

[英](C++) Matrix multiplication in a templated Matrix class

我遇到了矩阵类的问题,我找不到解决方案。

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

我不知道在/* ? */插入什么/* ? */ /* ? */部分。 有没有办法让编译器接受任何无符号整数值? 我应该以不同的方式重写代码吗?

注意:我是为了学术目的创建这个类,我不在乎是否已经有这样的库。

使用带有整数模板参数的模板成员函数:

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

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

你可以看看这个例子,但不是做三重循环(非常低效),我委托给英特尔MKL dgemm

另请注意,使用operator*()表示矩阵类型是一个坏主意,因为您需要按值返回结果,除非您确定您的编译器具有已启用的命名返回值优化(NRVO)并且已经过测试。 也就是说,您不希望按值返回矩阵并导致非常昂贵的矩阵复制。 这就是为什么我在执行我选择定义的方法multiply ,而不是重载operator*()

operator*()的有效替代方法是定义operator*=()因此您可以像这样使用它,并且乘法的结果直接存储到A中:

A *= B; // or A = A*B 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM