• “Мой код должен выглядеть очень похожим на описание массивов, изложенное в большинстве учебников по математике”.
• Это относится также к векторам, матрицам и тензорам.
• Проверка на этапах компиляции и выполнения программы.
• Массивы любой размерности.
• Массивы с произвольным количеством элементов в любой размерности.
• Массивы являются полноценными переменными/объектами.
• Их можно передавать куда угодно.
• Обычные операции над массивами.
• Индексирование: ()
.
• Срезка: []
.
• Присваивание: =
.
• Операции пересчета (+=
, –=
, *=
, %=
и т.д.).
• Встроенные векторные операции (например, res[i] = a[i]*c+b[2]
).
• Скалярное произведение (res = сумма элементов a[i]*b[i]
; известна также как inner_product
).
• По существу, обеспечивает автоматическое преобразование традиционного исчисления массивов/векторов в текст программы, который в противном случае вы должны были бы написать сами (и добиться, чтобы они были не менее эффективными).
• Массивы при необходимости можно увеличивать (при их реализации не используются “магические” числа).
Библиотека Matrix
делает это и только это. Если вы хотите большего, то должны самостоятельно написать сложные функции обработки массивов, разреженных массивов, управления распределением памяти и так далее или использовать другую библиотеку, которая лучше соответствует вашим потребностям. Однако многие эти потребности можно удовлетворить с помощью алгоритмов и структур данных, надстроенных над библиотекой Matrix
. Библиотека Matrix
не является частью стандарта ISO C++. Вы можете найти ее описание на сайте в заголовке Matrix.h
. Свои возможности она определяет в пространстве имен Numeric_lib
. Мы выбрали слово Matrix
, потому что слова “вектор” и “массив” перегружены в библиотеках языка C++. Реализация библиотеки Matrix
основана на сложных методах, которые здесь не описываются.
24.5.1. Размерности и доступ
Рассмотрим простой пример.
#include "Matrix.h"
using namespace Numeric_lib;
void f(int n1, int n2, int n3)
{
Matrix
// одна размерность
Matrix
// одна размерность
ad1(7) = 0; // индексирование ( ) в стиле языка Fortran
ad1[7] = 8; // индексирование [ ] в стиле языка C
Matrix
Matrix
ad2(3,4) = 7.5; // истинное многомерное
// индексирование
ad3(3,4,5) = 9.2;
}
Matrix
(объект класса Matrix
), вы должны указать тип элемента и количество размерностей. Очевидно, что класс Matrix
является шаблонным, а тип элементов и количество размерностей представляют собой шаблонные параметры. В результате, передав пару шаблонных параметров классу Matrix
(например, Matrix
), получаем тип (класс), с помощью которого можно определить объекты, указав аргументы (например, Matrix
); эти аргументы задают размерности. Итак, переменная ad2
является двумерным массивом с размерностями n1
и n2
, которую также называют матрицей n1
на n2
. Для того чтобы получить элемент объявленного типа из одномерного объекта класса Matrix
, следует указать один индекс. Для того чтобы получить элемент объявленного типа из двумерного объекта класса Matrix
, следует указать два индекса.
Как и во встроенных массивах и объектах класса vector
, элементы в объекте класса Matrix
индексируются с нуля (а не с единицы, как в языке Fortran); иначе говоря, элементы объекта класса Matrix
нумеруются в диапазоне [0,max], где max — количество элементов.
Matrix
: по умолчанию он является одномерным. Обратите внимание также на то, что мы можем использовать как индексирование с помощью оператора [] (в стиле языков C и C++), так и с помощью оператора () (в стиле языка Fortran).