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

(C++) Matrix multiplication in a templated Matrix class

本文关键字:C++      更新时间:2023-10-16

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

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 
相关文章:
  • 没有找到相关文章