我知道当大多数或所有内容都被矢量化时,MATLAB的效果会更好。我有两组向量X和T.对于X中的每个向量x,我想计算:
这是因为我想计算:
可以很容易地表达为MATLAB线性代数运算,就像我上面用点积所写的那样。我希望我可以通过使用这些向量来加快速度,而不是用for循环计算每个f(x)。理想情况下,我可以将它全部矢量化并计算:
我已经考虑了一段时间了,但是它似乎不是一个很好的方式,如果一个函数需要两个向量并计算每个向量之间的范数,而我必须明确地写出for循环。
即。我已经实现了一些简单的代码:
function [ f ] = f_start( x, c, t )
% Computes f^*(x) = sum_i c_i exp( - || x_i - t_i ||^2)
% Inputs:
% x = data point (D x 1)
% c = weights (K x 1)
% t = centers (D x K)
% Outputs:
% f = f^*(x) = sum_k c_k exp( - || x - t_k ||^2)
[~, K] = size(t);
f = 0;
for k=1:K
c_k = c(k);
t_k = t(:, k);
norm_squared = norm(x - t_k, 2)^2;
f = f + c_k * exp( -1 * norm_squared );
end
end
但我希望有一种不那么天真的方式来做到这一点!
答案 0 :(得分:4)
我想你想要pdist2
(统计工具箱):
X = [1 2 3;
4 5 6];
T = [1 2 3;
1 2 4;
7 8 9];
result = pdist2(X,T);
给出
result =
0 1.0000 10.3923
5.1962 4.6904 5.1962
同样,如果您没有该工具箱,请按以下方式使用bsxfun
:
result = squeeze(sqrt(sum(bsxfun(@minus, X, permute(T, [3 2 1])).^2, 2)));
答案 1 :(得分:0)
另一种仅用于踢球的方法
X = [1 2 3;
4 5 6].';
T = [1 2 3;
1 2 4;
7 8 9].';
tT = repmat(T,[1,size(X,2)]);
tX = reshape(repmat(X,[size(T,2),1]),size(tT));
res=reshape(sqrt(sum((tT-tX).^2)).',[size(T,2),size(X,2)]).'