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