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

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

Похожие примеры

Подробнее о