Литмир - Электронная Библиотека
A
A

 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;

}

 

Программирование. Принципы и практика использования C++ Исправленное издание - _001.png
 Итак, определяя переменную типа
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 — количество элементов.

 

Программирование. Принципы и практика использования C++ Исправленное издание - _002.png
 Это просто и взято прямо из учебника. Если у вас возникнут проблемы, нужно лишь обратиться к нужному учебнику по математике, а не к руководству по программированию. Единственная тонкость здесь заключается в том, что мы не указали количество размерностей в объекте класса
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 — за пределами диапазона)

 ad1 = ai;                 // ошибка: разные типы элементов

 ad1 = ad11;               // исключение Matrix_error

                           // (разные размерности)

Matrix<double,2> ad2(n1);  // ошибка: пропущена длина 2-й

                           // размерности

 ad2(3) = 7.5;             // ошибка: неправильное количество

                           // индексов

 ad2(1,2,3) = 7.5;         // ошибка: неправильное количество

                           // индексов

 Matrix<double,3> ad3(n1,n2,n3);

 Matrix<double,3> ad33(n1,n2,n3);

 ad3 = ad33;               // OK: одинаковые типы элементов,

                           // одинаковые размерности

}

Несоответствия между объявленным количеством размерностей и их использованием обнаруживается на этапе компиляции. Выход за пределы диапазона перехватывается на этапе выполнения программы; при этом генерируется исключение

Matrix_error
.

 

Программирование. Принципы и практика использования C++ Исправленное издание - _002.png
 Первая размерность матрицы — это строка, а вторая — столбец, поэтому индекс — это двумерная матрица (двумерный массив), имеющая вид (строка,столбец). Можно также использовать обозначение [строка][столбец], так как индексирование двумерной матрицы с помощью одномерного индекса порождает одномерную матрицу — строку. Эту ситуацию можно проиллюстрировать следующим образом.

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

Этот объект класса

Matrix
размещается в памяти построчно.

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

Класс

Matrix
знает свою размерность, поэтому его элементы можно очень просто передавать как аргумент,

334
{"b":"847443","o":1}