В вашем первом фрагменте кода я предполагаю, что это медленная часть:
vec_xz=linspace(0,del_z_H,pixl);
vec_yz=linspace(0,del_z_V,pixl);
[X,Y] = meshgrid(vec_yz,vec_xz);
Z1=(X + Y);
shift=Z1(pixl/2,pixl/2);
valZ=round((Z1-shift),2);
Поскольку вы имеете дело с очень большими изображениями, я предполагаю, что pixl
здесь - большое число.Вы генерируете 4 матрицы размера вашего изображения.Но 3 из них содержат промежуточные данные, которые используются только в коде выше.Вместо присвоения каждого результата вычисления новой переменной, используйте переменные повторно, чтобы не использовать слишком много памяти.Например, вызов функции с x = func(x)
позволяет функции работать на месте, изменяя x
вместо ее копирования.Теперь у вас больше не должно быть Z1
, чтобы занять память.
Изображения X
и Y
совершенно излишни.Начиная с R2016b, вы можете просто добавить два ортогональных вектора, и за 10 лет до этого у нас было bsxfun
для этого типа операции.Это не только экономит память, но и ускоряет вычисления за счет лучшего использования кэша.
Таким образом, вы можете сделать то же самое, что и выше:
vec_xz = linspace(0, del_z_H, pixl);
vec_yz = linspace(0, del_z_V, pixl);
valZ = vec_xz + vec_yz.';
shift = valZ(pixl/2, pixl/2);
valZ = round(valZ-shift, 2);
Если у вас более старыйверсии MATLAB, затем замените 3-ю строку на:
valZ = bsxfun(@plus, vec_xz, vec_yz.');
Наконец, мы можем уменьшить количество операций, изменив их порядок: вместо того, чтобы вычитать shift
из каждого пикселя, мы вычитаем часть из каждого издва вектора:
vec_xz = linspace(0, del_z_H, pixl);
vec_xz = vec_xz - vec_xz(pixl/2);
vec_yz = linspace(0, del_z_V, pixl);
vec_yz = vec_yz - vec_yz(pixl/2);
valZ = vec_xz + vec_yz.';
valZ = round(valZ, 2);
Что касается второй части вашего вопроса, я не знаю, что еще там происходит и что вы делаете со строкой, которую вы строите, но если все, что вы делаетеэто построить эту длинную строку и затем записать ее в файл, вместо этого вы должны записать ее в файл по ходу дела:
file = fopen('name.txt', 'wt');
for ...
fwrite(file, [cmdJump;cmdZ;cmdMov];
end
fclose(file);
Если вам нужно как-то изменить строки перед записью, вы можете сохранить их вмассив ячеек, который вы можете предварительно выделить, потому что вы знаете количество итераций вашего цикла:
str2File = cell(N,1);
for ii=1:N
str2File{ii} = [cmdJump;cmdZ;cmdMov];
end