Элементы массива MATLAB^ векторизация, распределенные вычисления на нескольких CPU и GPU
MATLAB широко используется инженерами и учеными для решения разнообразных задач. Одной из ключевых особенностей MATLAB является работа с массивами данных. В этой статье мы рассмотрим, что представляют собой элементы массива в MATLAB, как их создавать и манипулировать ими.
Понятие массива в MATLAB
В отличие от массивов в классических языках программирования, таких как C или Java, matlab массив представляет собой более высокоуровневую структуру данных. Любая переменная в MATLAB по своей сути является массивом, даже если это всего одно значение.
Основные особенности массивов в MATLAB:
- Элементы массива могут быть числами, строками, логическими значениями или ячейками
- MATLAB поддерживает массивы произвольной размерности
- Встроенные функции позволяют выполнять операции сразу над всем массивом, а не поэлементно
- Индексация элементов начинается с 1 (в отличие от 0 во многих языках)
Благодаря этим особенностям, массив становится более мощным и гибким инструментом для решения инженерных и научных задач в MATLAB.
Типы элементов массива
Matlab массив может содержать числовые, строковые и логические данные, а также ячейки произвольных типов. Рассмотрим подробнее каждый из этих вариантов.
Числовые массивы
Это наиболее распространенный тип массивов в MATLAB. Числовой массив может содержать данные типа double (вещественные числа двойной точности) или других числовых классов, например int8, uint16 и т.д.
Пример создания числового массива:
A = [1.5, 3.7, 2.8];
Строковые массивы
Элементами строкового массива являются символьные строки. Для создания используется функция char:
cities = char({'Москва', 'Вашингтон', 'Париж'});
Логические массивы
Логический массив содержит значения true и false. Часто используется как маска для индексации других массивов.
mask = [true, false, true];
Массивы ячеек
Ячейка в MATLAB может содержать данные любых типов и размерностей. Это позволяет комбинировать в массиве ячеек, например, числа, строки и другие массивы:
A = {3.14, 'text', [1,2;3,4]};
Такие гибридные структуры часто используются для хранения разнородных данных.
Создание массивов в MATLAB
Для создания matlab массив MATLAB предоставляет несколько способов:
- Конструктор массива
[]
- Функции генерации данных (zeros, ones, rand и др.)
- Загрузка данных из файлов
- Преобразование уже имеющихся данных в массив
Рассмотрим некоторые примеры подробнее.
Конструктор массива
Самый простой способ - задать значения элементов явно через конструктор []
:
A = [1, 2, 3]; % создает ряд-вектор B = [1; 2; 3]; % создает столбец-вектор C = [1, 2; 3, 4]; % создает матрицу 2x2
Функции генерации
Удобны для создания тестовых и случайных данных. Некоторые полезные функции:
zeros | массив из нулей |
ones | массив из единиц |
rand | массив случайных чисел |
Аргументы функций задают форму результирующего массива.
Z = zeros(2,3) % матрица 2x3 из нулей R = rand(4,1) % вектор-столбец 4x1 со случайными числами
Загрузка данных из файла
Данные из текстовых файлов, Excel, MATLAB и других форматов могут быть загружены в переменные MATLAB с помощью функций ввода-вывода:
A = load('data.txt'); B = xlsread('book1.xlsx');
При этом создается массив, элементами которого становятся загруженные данные.
Доступ к элементам массива
Для получения значений отдельных элементов matlab массив используется индексация.
В MATLAB индексация начинается с 1. Для доступа к элементу указывается его индекс в квадратных скобках после имени массива:
A = [1, 2, 3]; x = A(2); % x = 2
В двумерных и более массивах указываются индексы по каждому измерению:
B = [1, 2; 3, 4]; y = B(2,1); % y = 3
Кроме того, можно использовать логические векторы-маски, чтобы получить подмассив элементов, удовлетворяющих определенному условию:
A = [1, 2, 3]; mask = A > 1; % [false, true, true] B = A(mask) % B = [2, 3]
Основные операции над массивами
Одно из главных преимуществ MATLAB - возможность выполнять операции и функции сразу над всеми элементами matlab массив, без явного цикла.
Например, чтобы увеличить каждый элемент на 1, достаточно:
A = [1, 2, 3]; B = A + 1 % B = [2, 3, 4]
Аналогично работает и большинство других математических операций.
Полезные функции для работы с массивами:
- Математические: sin, log, sqrt и др.
- Логические: and, or, xor
- Статистические: mean, std, median
- Манипуляции: sort, reshape, transpose
Эти функции также применяются сразу ко всем элементам массива при вызове.
Многомерные массивы
matlab двумерный массив или матрица были рассмотрены выше. Однако MATLAB позволяет использовать массивы произвольной размерности.
Например, можно создать трехмерный массив (тензор) со следующими индексами:
- Первое измерение: номер слоя
- Второе измерение: номер строки
- Третье измерение: номер столбца
X = rand(3,4,5); % тензор размера 3x4x5
Чтобы получить элемент, нужно указать его индекс по каждому измерению:
item = X(2,3,4); % элемент из 2-го слоя, 3-й строки, 4-го столбца
Аналогичным образом строится индексация и в массивах бОЛьшей размерности.
Большинство функций и операций MATLAB можно использовать с многомерными массивами без изменений.
Разреженные массивы
Для эффективного хранения и работы с большими массивами, в которых значительная часть элементов равна нулю, используются разреженные массивы ( sparse arrays ).
В разреженном массиве хранятся только ненулевые элементы, что экономит память. При обращении к элементу значение вычисляется на лету.
Для создания разреженного массива из обычного используется функция sparse
:
A = [1, 0, 3; 0, 0, 0]; S = sparse(A)
Разреженные массивы позволяют эффективно работать с огромными данными, когда алгоритмы на плотных массивах неприменимы из-за требований к памяти.
Конкатенация массивов
Часто бывает необходимо объединить два и более массива в один. Этот процесс называется конкатенацией (от англ. concatenate - соединять).
Для конкатенации в MATLAB используется оператор []
:
A = [1, 2, 3]; B = [4, 5, 6]; C = [A, B]
Результатом будет новый массив C = [1, 2, 3, 4, 5, 6]
. Конкатенация работает как с числовыми, так и со строковыми массивами.
Также поддерживается конкатенация по строкам и столбцам с помощью точки с запятой ;
:
A = [1, 2, 3]; B = [4, 5, 6]; C = [A; B]
Получится матрица со строками из исходных векторов:
C = 1 2 3 4 5 6
Преобразования размерности массива
MATLAB предоставляет гибкие средства для изменения формы массива без потери данных.
Переформирование
Функция reshape позволяет изменить число строк и столбцов массива:
A = 1:6; B = reshape(A, 3, 2)
Массив B
будет иметь размер 3x2, заполненный данными из одномерного массива A
подряд.
Транспонирование
Чтобы поменять строки и столбцы массива местами, используется оператор транспонирования '
:
A = magic(3) % магический квадрат B = A'
Массив B
будет транспонированной версией матрицы A
.
Циклы и векторизация в MATLAB
Хотя MATLAB поддерживает стандартные циклы вроде for и while , гораздо эффективнее обходиться без них за счет векторизованных операций.
Например, чтобы возвести каждый элемент массива A
в квадрат, вместо цикла достаточно:
A = [1, 2, 3]; B = A .^ 2;
Это работает гораздо быстрее любого for, поэтому старайтесь избегать явных циклов в MATLAB.
Вычисления на GPU с массивами
При работе с очень большими данными имеет смысл использовать вычислительную мощь графических процессоров (GPU).
Для этого массив перемещается в память GPU командой:
A = rand(5000000); % большой массив B = gpuArray(A);
А затем к нему применяются нужные операции, которые будут распараллелены на тысячи ядер GPU с огромным приростом скорости.
Поддержка GPU - критически важное преимущество MATLAB для работы с большими данными и искусственным интеллектом.
Параллельные вычисления с массивами
Еще один эффективный прием работы с большими данными в MATLAB - использование параллельных вычислений на нескольких ядрах CPU.
Для этого создается пул параллельных рабочих машин (MATLAB-сессий на одном или нескольких компьютерах):
pool = parpool(4); % 4 рабочих машины
Затем массив распределяется между ними командами:
A = rand(1000000); B = distribute(A);
После этого операции над массивом B
выполняются параллельно на 4 ядрах, что дает 4-кратный выигрыш в скорости.
Особенности распределенных массивов
При распределении массив разбивается на части и копируется в память рабочих машин. Это позволяет минимизировать накладные расходы на передачу данных между ядрами.
Однако распределенный массив занимает больше оперативной памяти - его копия хранится на каждом ядре.
Вычисления "на лету" с массивами
"Ленивые" массивы в MATLAB (создаваемые функцией lazy
) позволяют отложить фактические вычисления до обращения к элементу.
Это удобно, когда не весь массив используется в дальнейшем. Например:
X = lazy(rand(1000000, 100)); needed = X(5000, :); % выбрать строку
Здесь случайный массив не будет вычисляться целиком. В переменную needed
попадет только 50000-я строка по мере необходимости.
Такой подход более эффективен по памяти и быстродействию при работе с "бесконечными" наборами данных.
Сжатие массивов
Для экономии памяти большие массивы можно сжимать функциями:
A = rand(1000); As = compress(A);
Сжатие уменьшает требования к памяти в 2-5 раз в зависимости от исходных данных. Операции над сжатым массивом выполняются прозрачно, но медленнее.
При передаче по сети или записи в файл сжатые массивы занимают меньше места.