В примере 11.31 приведена программа, демонстрирующая применение шаблонного класса
kmatrix
.
Пример 11.31. Применение kmatrix
#include "kmatrix.hpp"
#include <iostream>
using namespace std;
template<class Iter_T>
void outputRowOrColumn(Iter_T iter, int n) {
for (int i=0; i < n; ++i) {
cout << iter[i] << " ";
}
cout << endl;
}
template<class Matrix_T>
void initializeMatrix(Matrix_T& m) {
int k = 0;
for (int i=0; i < m.rows; ++i) {
for (int j=0; j < m.cols; ++j) {
m[i][j] = k++;
}
}
}
template<class Matrix_T>
void outputMatrix(Matrix_T& m) {
for (int i=0; i < m.rows; ++i) {
cout << "Row " << i << " = ";
outputRowOrColumn(m.row(i), m.cols);
}
for (int i=0; i < m.cols; ++i) {
cout << "Column " << i << " = ";
outputRowOrColumn(m.col(i), m.rows);
}
}
int main {
kmatrix<int, 2, 4> m;
initializeMatrix(m); m *= 2;
outputMatrix(m);
}
Программа
примера 11.31 выдает следующий результат.
Row 0 = 0 2 4 6
Row 1 = 8 10 12 14
Column 0 = 0 8
Column 1 = 2 10
Column 2 = 4 12
Column 3 = 6 14
Обсуждение
Представленные в примерах 11.30 и 11.31 определение шаблона класса
kmatrix
и пример его использования очень напоминают шаблон класса
matrix
из рецепта 11.14. Единственным существенным отличием является то, что при объявлении экземпляра
kmatrix
приходится передавать размерности матрицы через параметры шаблона, например;
kmatrix<int 5, 6> m; // объявляет
матрицу с пятью строками и шестью
// столбцами
В приложениях многих типов часто требуется, чтобы матрицы имели размерности, известные на этапе компиляции. Передача размера строк и столбцов через параметры шаблона позволяет компилятору легче применять такую оптимизацию, как развертка цикла, встраивание функций и ускорение индексации.
Как и рассмотренный ранее шаблон статического вектора (
kvector
), шаблон
kmatrix
особенно эффективен при небольших размерах матрицы.
Смотри также
Рецепты 11.14 и 11.16.
11.16. Умножение матриц
Проблема
Требуется эффективно выполнить умножение двух матриц.
Решение
Пример 11.32 показывает, как можно выполнить умножение матриц, причем эта реализация подходит как для динамических, так и для статических матриц. Формально этот алгоритм реализует соотношение A=A+B*C, которое (возможно, неожиданно) вычисляется более эффективно, чем A=B*C.