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
для числовых массивов
cell
для символьных массивов
Когда вы предварительно выделите блок памяти, чтобы содержать матрицу некоторого типа кроме double
, избегайте использования метода
A = int8(zeros(100));
Этот оператор предварительно выделяет 100 100 матрица int8
, сначала путем создания полной матрицы значений double
, и затем преобразованиями каждый элемент к int8
. Создание массива как значения int8
экономит время и память. Например:
A = zeros(100, 'int8');