for и while циклы, которые постепенно увеличивают размер структуры данных каждый раз через цикл, могут отрицательно влиять на производительность и использование памяти. Многократное изменение размеров массивов часто требует от MATLAB ® потратить дополнительное время на поиск более крупных смежных блоков памяти, а затем переместить массив в эти блоки. Часто можно увеличить время выполнения кода путем предварительного выделения максимального пространства, необходимого для массива.
Следующий код отображает время, необходимое для создания скалярной переменной. x, а затем постепенно увеличить размер x в for цикл.
tic x = 0; for k = 2:1000000 x(k) = x(k-1) + 5; end toc
Elapsed time is 0.301528 seconds.
При предварительном выделении блока памяти размером 1 на 1 000 000 для x и инициализировать его до нуля, то код работает намного быстрее, потому что нет необходимости многократно перераспределять память для растущей структуры данных.
tic x = zeros(1, 1000000); for k = 2:1000000 x(k) = x(k-1) + 5; end toc
Elapsed time is 0.011938 seconds.
Используйте соответствующую функцию предварительного выделения для типа массива, который требуется инициализировать:
zeros для числовых массивов
strings для массивов строк
cell для массивов ячеек
table для массивов таблиц
При предварительном выделении блока памяти для хранения матрицы какого-либо типа, отличного от double, избегайте использования метода
A = int8(zeros(100));
Этот оператор предварительно распределяет матрицу 100 на 100 int8, сначала путем создания полной матрицы double значения, а затем по преобразует каждый элемент в int8. Создание массива как int8 значения экономят время и память. Например:
A = zeros(100, 'int8');