Чтение онлайн

на главную - закладки

Жанры

Программирование. Принципы и практика использования C++ Исправленное издание
Шрифт:

Этот способ слишком сложен, примитивен и уязвим для ошибок. Он также слишком медленный, поскольку явное вычисление позиции элемента усложняет оптимизацию. Вместо того чтобы учить вас, как справиться с этой ситуацией, мы сконцентрируемся на библиотеке С++, которая вообще устраняет проблемы, связанные с встроенными массивами.

24.5. Библиотека Matrix

Каково основное предназначение массива (матрицы) в численных расчетах?

• “Мой код должен выглядеть очень похожим на описание массивов, изложенное в большинстве

учебников по математике”.

• Это относится также к векторам, матрицам и тензорам.

• Проверка на этапах компиляции и выполнения программы.

• Массивы любой размерности.

• Массивы с произвольным количеством элементов в любой размерности.

• Массивы являются полноценными переменными/объектами.

• Их можно передавать куда угодно.

• Обычные операции над массивами.

• Индексирование:

.

• Срезка:

[]
.

• Присваивание:

=
.

• Операции пересчета (

+=
,
–=
,
*=
,
%=
и т.д.).

• Встроенные векторные операции (например,

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<double,1> ad1(n1); // элементы типа double;

// одна размерность

Matrix<int,1> ai1(n1); // элементы типа int;

// одна размерность

ad1(7) = 0; // индексирование в стиле языка Fortran

ad1[7] = 8; // индексирование [ ] в стиле языка C

Matrix<double,2> ad2(n1,n2); // двумерный

Matrix<double,3> ad3(n1,n2,n3); // трехмерный

ad2(3,4) = 7.5; // истинное многомерное

// индексирование

ad3(3,4,5) = 9.2;

}

Итак, определяя переменную типа
Matrix
(объект класса
Matrix
), вы должны указать тип элемента и количество размерностей. Очевидно, что класс
Matrix
является шаблонным, а тип элементов и количество размерностей представляют собой шаблонные параметры. В результате, передав пару шаблонных параметров классу
Matrix
(например,
Matrix<double,2>
), получаем тип (класс), с помощью которого можно определить объекты, указав аргументы (например,
Matrix<double,2>ad2(n1,n2)
); эти аргументы задают размерности. Итак, переменная
ad2
является двумерным массивом с размерностями
n1
и
n2
, которую также называют матрицей
n1
на
n2
. Для того чтобы получить элемент объявленного типа из одномерного объекта класса
Matrix
, следует указать один индекс. Для того чтобы получить элемент объявленного типа из двумерного объекта класса
Matrix
, следует указать два индекса.

Как и во встроенных массивах и объектах класса

vector
, элементы в объекте класса
Matrix
индексируются с нуля (а не с единицы, как в языке Fortran); иначе говоря, элементы объекта класса
Matrix
нумеруются в диапазоне [0,max], где max — количество элементов.

Это просто и взято прямо из учебника. Если у вас возникнут проблемы, нужно лишь обратиться к нужному учебнику по математике, а не к руководству по программированию. Единственная тонкость здесь заключается в том, что мы не указали количество размерностей в объекте класса
Matrix
: по умолчанию он является одномерным. Обратите внимание также на то, что мы можем использовать как индексирование с помощью оператора [] (в стиле языков C и C++), так и с помощью оператора (в стиле языка Fortran).

Это позволяет нам лучше справляться с большим количеством размерностей. Индекс

[x]
всегда означает отдельный индекс, выделяя отдельную строку в объекте класса
Matrix
; если переменная
a
является n мерным объектом класса
Matrix
, то
a[x]
— это (n–1)-размерный объект класса
Matrix
. Обозначение
(x,y,z)
подразумевает использование нескольких индексов, выделяя соответствующий элемент объекта класса
Matrix
; количество индексов должно равняться количеству размерностей.

Посмотрим, что произойдет, если мы сделаем ошибку.

void f(int n1,int n2,int n3)

{

Matrix<int,0> ai0; // ошибка: 0-размерных матриц не бывает

Matrix<double,1> ad1(5);

Matrix<int,1> ai(5);

Matrix<double,1> ad11(7);

ad1(7) = 0; // исключение Matrix_error

// (7 — за пределами диапазона)

Поделиться:
Популярные книги

Мастер Разума V

Кронос Александр
5. Мастер Разума
Фантастика:
городское фэнтези
попаданцы
5.00
рейтинг книги
Мастер Разума V

Последний из рода Демидовых

Ветров Борис
Фантастика:
детективная фантастика
попаданцы
аниме
5.00
рейтинг книги
Последний из рода Демидовых

Любовь Носорога

Зайцева Мария
Любовные романы:
современные любовные романы
9.11
рейтинг книги
Любовь Носорога

Авиатор: назад в СССР 12

Дорин Михаил
12. Покоряя небо
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Авиатор: назад в СССР 12

Толян и его команда

Иванов Дмитрий
6. Девяностые
Фантастика:
попаданцы
альтернативная история
7.17
рейтинг книги
Толян и его команда

Академия

Кондакова Анна
2. Клан Волка
Фантастика:
боевая фантастика
5.40
рейтинг книги
Академия

Изгой. Пенталогия

Михайлов Дем Алексеевич
Изгой
Фантастика:
фэнтези
9.01
рейтинг книги
Изгой. Пенталогия

Неудержимый. Книга IX

Боярский Андрей
9. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга IX

Невеста

Вудворт Франциска
Любовные романы:
любовно-фантастические романы
эро литература
8.54
рейтинг книги
Невеста

Энфис 2

Кронос Александр
2. Эрра
Фантастика:
героическая фантастика
рпг
аниме
5.00
рейтинг книги
Энфис 2

Убийца

Бубела Олег Николаевич
3. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.26
рейтинг книги
Убийца

Лорд Системы

Токсик Саша
1. Лорд Системы
Фантастика:
фэнтези
попаданцы
рпг
4.00
рейтинг книги
Лорд Системы

Делегат

Астахов Евгений Евгеньевич
6. Сопряжение
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Делегат

Невеста напрокат

Завгородняя Анна Александровна
Любовные романы:
любовно-фантастические романы
6.20
рейтинг книги
Невеста напрокат