Это позволяет нам лучше справляться с большим количеством размерностей. Индекс [x]
всегда означает отдельный индекс, выделяя отдельную строку в объекте класса Matrix
; если переменная a
является Matrix
, то a[x]
— это (Matrix
. Обозначение (x,y,z)
подразумевает использование нескольких индексов, выделяя соответствующий элемент объекта класса Matrix
; количество индексов должно равняться количеству размерностей.
Посмотрим, что произойдет, если мы сделаем ошибку.
void f(int n1,int n2,int n3)
{
Matrix
Matrix
Matrix
Matrix
ad1(7) = 0; // исключение Matrix_error
// (7 — за пределами диапазона)
ad1 = ai; // ошибка: разные типы элементов
ad1 = ad11; // исключение Matrix_error
// (разные размерности)
Matrix
// размерности
ad2(3) = 7.5; // ошибка: неправильное количество
// индексов
ad2(1,2,3) = 7.5; // ошибка: неправильное количество
// индексов
Matrix
Matrix
ad3 = ad33; // OK: одинаковые типы элементов,
// одинаковые размерности
}
Несоответствия между объявленным количеством размерностей и их использованием обнаруживается на этапе компиляции. Выход за пределы диапазона перехватывается на этапе выполнения программы; при этом генерируется исключение Matrix_error
.
Этот объект класса Matrix
размещается в памяти построчно.
Класс Matrix
знает свою размерность, поэтому его элементы можно очень просто передавать как аргумент,
void init(Matrix
// характеристическим значением
{
for (int i=0; i
for (int j = 0; j
a(i,j) = 10*i+j;
}
void print(const Matrix
{
for (int i=0; i
for (int j = 0; j
cout << a(i,j) <<'\t';
cout << '\n';
}
}
dim1()
— это количество элементов в первой размерности, dim2()
— количество элементов во второй размерности и т.д. Тип элементов и количество размерностей являются частью класса Matrix
, поэтому невозможно написать функцию, получающую объект класса Matrix
как аргумент (но можно написать шаблон).
void init(Matrix& a); // ошибка: пропущены тип элементов
// и количество размерностей
Обратите внимание на то, что библиотека Matrix
не содержит матричных операций, например, сложение двух четырехмерных матриц или умножение двумерных матриц с одномерными. Элегантная реализация этих операций выходит за рамки этой библиотеки. Соответствующие матричные библиотеки можно надстроить над библиотекой Matrix
(см. упр. 12).
24.5.2. Одномерный объект класса Matrix
Что можно сделать с простейшим объектом класса Matrix
— одномерной матрицей?
Количество размерностей в объявлении такого объекта можно не указывать, потому что по умолчанию это число равно единице.
Matrix
Matrix
Таким образом, объекты a
и a1
имеют одинаковый тип (Matrix
). У каждого объекта класса Matrix
можно запросить общее количество элементов и количество элементов в определенном измерении. У одномерного объекта класса Matrix
эти параметры совпадают.
a.size(); // количество элементов в объекте класса Matrix
a.dim1(); // количество элементов в первом измерении