Динамические матрицы в C++

Динамическими в C++ могут быть не только одномерные массивы, но также и многомерные. Из тех, что входят в класс последних, рассмотрим двумерные динамические массивы (динамические матрицы). Ключевым объектом для работы с ними являются указатели.


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

При работе с динамическими матрицами в C++ можно использовать обычные указатели. После описания указателя, необходимо будет выделить память для хранения NxM элементов (N — число строк, M — число столбцов). Так выделяется память для хранения целочисленной матрицы размером NxM:

Для выделения памяти можно использовать также и функцию malloc:

или операцию new:

После выделения памяти, остается найти способ обратиться к элементу матрицы. Все элементы двумерного массива хранятся в одномерном массиве размером NxM элементов. Сначала в этом массиве расположена 0-я строка матрицы, затем 1-я и т. д. Поэтому для обращения к элементу Ai, j необходимо по номеру строки i и номеру столбца j вычислить номер элемента k в динамическом массиве. Учитывая, что в массиве элементы нумеруются с нуля k = iM + j, обращение к элементу A[i] [j] будет таким *(A + i*m+j).

В качестве примера работы с динамическими матрицами рассмотрим задачу.

Задача

Заданы две матрицы матрицы вещественных чисел A(N, M) и B(N, M). Вычислить матрицу C = A + B.

Решение

Как известно, суммой матриц одинаковой размерности называется матрица, элементы которой получаются сложением соответствующих элементов исходных матриц. Рассмотрим блок-схему алгоритма сложения матриц.

динамические матрицы

Код программы сложения матриц:

Использование двойных указателей для работы с динамическими матрицами

Основной способ работы с динамическими матрицами базируется на использовании двойных указателей. Рассмотрим следующий фрагмент программы.

С помощью оператора new создан массив из N элементов, каждый из которых является адресом, где хранится указатель на float. Осталось определить значение этого указателя. Для этого организуем цикл от 0 до N-1, в котором каждый указатель будет адресовать участок памяти, где хранится M элементов типа float.

После этого определен массив N указателей, каждый из которых адресует массив из M вещественных чисел (типа float). Фактически создана динамическая матрица размера NxM. Обращение к элементу динамической матрицы проходит так же, как и к элементу статической матрицы. Для обращение к элементу ai, j в программе на C++ необходимо указать ее имя, и в квадратных скобках номер строки и столбца (a[i] [j]).

Задача

Написать программу умножения двух матриц вещественных чисел A(N, M) и A(M, L).

Решение

Программа перемножения двух таких матриц, реализованных при помощи двойных указателей, будет выглядеть так:

 


Похожие записи:

Оставить комментарий

Ваш e-mail не будет опубликован. Обязательные поля отмечены *