【问题标题】:What is a quick way to compute the euclidean norm of two sets of vectors?计算两组向量的欧几里得范数的快速方法是什么?
【发布时间】:2015-07-30 17:46:49
【问题描述】:

我知道当大多数或所有内容都被矢量化时,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

但我希望有一种不那么天真的方法来做到这一点!

【问题讨论】:

    标签: matlab optimization vector


    【解决方案1】:

    我想你想要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)));
    

    【讨论】:

      【解决方案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)]).'
      

      【讨论】:

        猜你喜欢
        • 2012-06-11
        • 1970-01-01
        • 2010-11-11
        • 2017-02-02
        • 2016-04-08
        • 1970-01-01
        • 1970-01-01
        • 2019-04-21
        • 1970-01-01
        相关资源
        最近更新 更多