Я профилирую свой код, и эта строка кажется узким местом.Идея состоит в том, чтобы создать пространственную корреляционную матрицу из n наблюдений заданного измерения, основанную на тета-векторе того же измерения, который содержит размерные гиперпараметры для подгонки.
В моем общем коде эта функция пространственной корреляции вызывается тысячи раз (за одну итерацию) при вычислении функции правдоподобия для оптимизации моих тета-параметров.Число наблюдений увеличивается на единицу в каждой итерации всего кода, и тета-параметры должны быть обновлены в каждой итерации.Таким образом, вы можете видеть, как эта строка кода становится критически важной по мере продвижения алгоритма.
Я думаю, что самой медленной строке, т. Е. R = exp(sum(bsxfun(@times, -abs(D_X).^corr_model,reshape(theta,[1 1 d])),3));
, требуется больше времени для вычисления конечной поэлементной экспоненты по полученному nпо матрице n (матрица n по n получается после суммирования по 3 измерениям матрицы расстояний).Но в этой линии многое происходит, поэтому я не уверен, является ли это наиболее важным аспектом общей производительности.
Спасибо за ваше понимание!
Я уже заменил команду repmat
на bsxfun
, чтобы умножить данные тэты на матрицу размерного расстояния D_X
, что заметно ускорило код.Однако, вложив секунду bsxfun
для выполнения возведения в квадрат расстояний, т. Е. Для замены abs(D_X).^corr_model
, код стал работать медленнее.
n = 500;
dimension = 20;
D_X = repmat(rand(n),[1 1 dimension]);
theta = rand(dimension, 1);
corr_model = 2;
R = corr(corr_model,theta, D_X);
function R = corr(corr_model,theta,D_X)
% calculate the correlation matrix for the modified nugget effect model
% corr_model - the correlation model used for the spatial correlation
% corr_model = 2: gaussian correlation function
% theta - vector of hyperparameters
% D_X - the distance matrix for the input locations
d = size(theta,1);
switch corr_model
case 2 %Gaussian correlation function
R = exp(sum(bsxfun(@times, -abs(D_X).^corr_model,reshape(theta,[1 1 d])),3));
end
end