Одна из первых вещей, которые хорошо узнают о программировании в MATLAB, заключается в том, чтобы избежать динамического изменения размеров массивов. Стандартный пример следующий.
N = 1000;
% Method 0: Bad
clear a
for i=1:N
a(i) = cos(i);
end
% Method 1: Better
clear a; a = zeros(N,1);
for i=1:N
a(i) = cos(i)
end
Для варианта "Bad" требуется время O (N
^ 2), так как оно должно выделять новый массив и копировать старые значения на каждой итерации цикла.
Моя собственная предпочтительная практика, когда отладка заключается в распределении массива с NaN
, сложнее путать с допустимым значением, чем 0
.
% Method 2: Easier to Debug
clear a; a = NaN(N,1);
for i=1:N
a(i) = cos(i)
end
Тем не менее, можно было бы наивно полагать, что как только наш код отлаживается, мы теряем время, выделяя массив, а затем заполняя его 0
или NaN
. Как отмечено здесь, вы можете создать неинициализированный массив следующим образом
% Method 3 : Even Better?
clear a; a(N,1) = 0;
for i=1:N
a(i) = cos(i);
end
Однако в моих собственных тестах (MATLAB R2013a) я не вижу заметной разницы между методами 1 и 3, в то время как метод 2 занимает больше времени. Это говорит о том, что MATLAB избегала явной инициализации массива до нуля, когда вызывается a = zeros(N,1)
.
Таким образом, мне любопытно узнать
- Каков оптимальный способ переназначения (неинициализированного) массива в MATLAB? (Самое главное, большие массивы)
- Это также относится к Octave?