exponenta event banner

Предварительное распределение

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');

Связанные примеры

Подробнее