шаблоны — (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 */
};

Я не знаю, что вставить в /* ? */ разделы.
Есть ли способ позволить компилятору принимать любое целое число без знака? Должен ли я переписать код по-другому?

Примечание: я создаю этот класс для академических целей, мне все равно, есть ли уже библиотеки, которые делают это.

3

Решение

Используйте функцию-член шаблона с целочисленным параметром шаблона:

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

Также не возвращайте значение по ссылке.

2

Другие решения

Вы можете взглянуть на этот пример но вместо тройного цикла (очень неэффективно) я делегирую Intel MKL dgemm,

Обратите внимание, также используя operator*() для матричного типа это плохая идея, потому что вам нужно возвращать результат по значению, если только вы не уверены, что у вас есть компилятор с включенной оптимизацией именованных возвращаемых значений (NRVO) и проверено, что он работает. А именно, вы не хотите возвращать матрицу по значению и подвергаетесь очень дорогостоящему копированию матрицы. Вот почему в моей реализации я решил определить метод multiply вместо перегрузки operator*()

Эффективная альтернатива operator*() будет определять operator*=() так что вы используете его следующим образом, и результат умножения сохраняется в A:

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

По вопросам рекламы [email protected]