使用模板类进行矩阵乘法

问题描述 投票:0回答:1

我正在尝试使用以下矩阵的类声明来编写矩阵乘法:

template<class T, int rows, int cols>
class matrix {
private:
    T m_data[rows * cols];
    int m_rows;
    int m_cols;
public:
    //constructors
    matrix() : m_cols(rows), m_rows(cols) {
        for (int i = 0; i < rows * cols; i++)
            m_data[i] = T(); //default constructor of data type
    }

    matrix(const matrix& other) : m_cols(other.m_cols), m_rows(other.m_rows) {
        for (int i = 0; i < other.size(); i++)
            m_data[i] = other.m_data[i];
    }

    //other functions...

这是我的尝试:

matrix<T, rows, int> operator*(const matrix<T, cols, int>& RHS) const { //error referenced below refers to this line
        if (m_cols != RHS.m_rows) {
            throw std::invalid_argument("Matrix dimensions must match for multiplication!");
        }

        matrix<T, rows, int> toReturn;

        for (int i = 0; i < rows; ++i) {
            for (int j = 0; j < RHS.m_cols; ++j) {
                toReturn(i, j) = 0;
                for (int k = 0; k < cols; ++k) {
                    toReturn(i, j) += (*this)(i, k) * RHS(k, j);
                }
            }
        }

        return toReturn;
    }

我遇到的错误是:

Error C2993 'int': is not a valid type for non-type template parameter 'cols'

main.cpp
中,我尝试这样使用该函数:

matrix<int, 2, 2> m1;
m1.set(0, 0, 1);
m1.set(0, 1, 2);
m1.set(1, 0, 3);
m1.set(1, 1, 4);

matrix<int, 2, 1> m2;
m2.set(0, 0, 1);
m2.set(1, 0, 1);

matrix<int, 2, 1> m3 = m1 * m2;

我现在得到的错误是:

C2679 binary '*': no operator found which takes a right-hand operand of type 'matrix<int,2,1>' (or there is no acceptable conversion)

c++ class templates matrix linear-algebra
1个回答
0
投票

你正朝着正确的方向前进。但是,将

int
用于非类型模板参数是没有意义的。您正在寻找的是
operator*
函数模板。最好将其设为免费函数而不是会员函数:

template<class T, int rows, int dim, int cols>
matrix<T, rows, cols> operator*(const matrix<T, rows, dim>& m1, const matrix<T, dim, cols>& m2) {
    matrix<T, rows, cols> res;
    // calculation matrix elements of res
    return res;
}

因为维度被编码为矩阵类型,所以你不需要任何运行时检查,编译器会为你做这件事 - 如果维度不一致,

operator*
将根本不匹配。

另请注意,由于维度是类型的一部分,因此您实际上并不需要

m_rows
m_cols
数据成员。使用
rows
cols
模板参数。

© www.soinside.com 2019 - 2024. All rights reserved.