Кажется, в ваших последних изменениях вы ввели некоторые синтаксические ошибки, но я думаю, что я понял, что вы пытались сделать (из первой версии).
Вместо использования REPMAT или индексирование для повторения вектора x(i,:)
для соответствия строкам z
, рассмотрите возможность использования эффективной функции BSXFUN :
rbf(:,i) = exp( -g .* sum(bsxfun(@minus,z,x(i,:)).^2,2) );
Очевидно, что вышеприведенное зацикливается на каждой строке x
Вы можете пойти еще дальше и использовать PDIST2 для вычисления евклидова расстояния между каждой парой строк в z
и x
:
%# some random data
X = rand(10,2);
Z = rand(10,2);
g = 0.5;
%# one-line solution
rbf = exp(-g .* pdist2(Z,X,'euclidean').^2);
Теперь каждое значение в матрице: rbf(i,j)
соответствует значению функции между z(i,:)
и x(j,:)
РЕДАКТИРОВАТЬ:
Я рассчитал различные методы, здесьэто код, который я использовал:
%# some random data
N = 5000;
X = rand(N,2);
Z = rand(N,2);
g = 0.5;
%# PDIST2
tic
rbf1 = exp(-g .* pdist2(Z,X,'euclidean').^2);
toc
%# BSXFUN+loop
tic
rbf2 = zeros(N,N);
for j=1:N
rbf2(:,j) = exp( -g .* sum(bsxfun(@minus,Z,X(j,:)).^2,2) );
end
toc
%# REPMAT+loop
tic
rbf3 = zeros(N,N);
for j=1:N
rbf3(:,j) = exp( -g .* sum((Z-repmat(X(j,:),[N 1])).^2,2) );
end
toc
%# check if results are equal
all( abs(rbf1(:)-rbf2(:)) < 1e-15 )
all( abs(rbf2(:)-rbf3(:)) < 1e-15 )
Результаты:
Elapsed time is 2.108313 seconds. # PDIST2
Elapsed time is 1.975865 seconds. # BSXFUN
Elapsed time is 2.706201 seconds. # REPMAT