Matlab 计算两组向量的欧几里德范数的快速方法是什么?

Matlab 计算两组向量的欧几里德范数的快速方法是什么?,matlab,optimization,vector,Matlab,Optimization,Vector,我知道,当大部分或所有内容都矢量化时,MATLAB工作得更好。我有两组向量X和T。对于X中的每个向量X,我要计算: 这是因为我想计算: 它可以很容易地表示为MATLAB线性代数运算,正如我在上面用点积写的那样。我希望通过使用这些向量,而不是使用for循环来计算每个f(x),可以加快计算速度。理想情况下,我可以将其全部矢量化并计算: 我已经考虑了一段时间了,但是如果一个函数接受两个向量并计算它们之间的范数,而不必显式地编写for循环,这似乎不是一个好方法 i、 e.我已经实现了简单的代码:

我知道,当大部分或所有内容都矢量化时,MATLAB工作得更好。我有两组向量X和T。对于X中的每个向量X,我要计算:

这是因为我想计算:

它可以很容易地表示为MATLAB线性代数运算,正如我在上面用点积写的那样。我希望通过使用这些向量,而不是使用for循环来计算每个f(x),可以加快计算速度。理想情况下,我可以将其全部矢量化并计算:

我已经考虑了一段时间了,但是如果一个函数接受两个向量并计算它们之间的范数,而不必显式地编写for循环,这似乎不是一个好方法

i、 e.我已经实现了简单的代码:

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
但我希望有一种不那么幼稚的方式来做到这一点

我想您需要(统计工具箱):

给予

同样,如果您没有工具箱,请按如下方式使用:

result = squeeze(sqrt(sum(bsxfun(@minus, X, permute(T, [3 2 1])).^2, 2)));
我想你需要(统计工具箱):

给予

同样,如果您没有工具箱,请按如下方式使用:

result = squeeze(sqrt(sum(bsxfun(@minus, X, permute(T, [3 2 1])).^2, 2)));

另一种只是踢的方法

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)]).'

另一种只是踢的方法

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)]).'