Вам действительно нужно использовать профилировщик, чтобы получить от него некоторые улучшения.Мое первое предположение (так как я не запустил профилировщик, который вы, как уже предлагали), было бы использовать как можно меньше операций length
.Поскольку вы обрабатываете каждое изображение с окном [7 7]
, вы можете предварительно рассчитать некоторые детали, чтобы не повторять эти действия
function dirvar(subfn)
[fn,pn] = uigetfile({'*.TIF; *.tiff; *.tif; *.TIFF; *.jpg; *.bmp; *.JPG; *.png'}, ...
'Select an image', '~/');
I = double(imread(fullfile(pn,fn)));
ld = input('Enter the lag distance = '); % prompt for lag distance
fh = eval(['@' subfn]); % Function handles
%% precalculations
wind = [7 7];
center = (wind+1)/2; % Finds the central pixel of moving window
EWlength = (wind(2)+1)/2;
h = EWlength - ld; % Number of lags
%% calculations
I2 = nlfilter(I, wind, fh);
imshow(I2); % Texture Layer Image
imwrite(I2,'result_mat.tif');
% Zero Degree Variogram
function [gamma] = ewvar(I)
EW = I(center(1),center(2):end); % Determines the values from central pixel to margin of window
gamma = 1/(2 * h) * sum((EW(1:ld:end-1) - EW(2:ld:end)).^2);
end
end
Обратите внимание, что при этом вы торгуете производительностью для ясности вашихкод и связь (между функцией dirvar
и вложенной функцией ewvar
).Однако, поскольку я не профилировал ваш код (вы должны сделать это самостоятельно, используя свои собственные входные данные), вы можете найти, какая строка вашего кода потребляет больше всего времени.
Для пакетной обработки я бы также рекомендовал:пропустите любые input
, imshow
, imwrite
и uigetfile
.Это команды, которые вы обычно вызываете из более высокоуровневой функции / скрипта и которые заставят вас вводить эти входные данные, даже если вы хотите, чтобы они оставались неизменными.Поэтому вместо этого кода сделайте каждую из переменных, которые они создают (/ process), параметром (/ return value) для вашей функции.Таким образом, вы можете оставить MATLAB включенным в выходные дни для обработки всего (без необходимости вручную вводить все эти значения), даже если вы не можете ускорить код.