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

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

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

Больше о