成对加权距离矢量化

rcp*_*nto 3 matlab r vectorization euclidean-distance julia

以下有效和矢量化的Matlab代码使用权重向量WTS(每个维度1个权重;所有点的相同权重)计算2组A点和B点之间的加权欧氏距离:

    WTS = sqrt(WTS); 

    % modify A and B against weight values
    A = WTS(ones(1,size(A,1)),:).*A;
    B = WTS(ones(1,size(B,1)),:).*B; 

    % calculate distance
    AA = sum(A.*A,2);  
    BB = sum(B.*B,2)'; 
    D = sqrt(AA(:,ones(1,size(B,1))) + BB(ones(1,size(A,1)),:) - 2*A*B'); 
Run Code Online (Sandbox Code Playgroud)

(来源:https://github.com/nolanbconaway/pairdist/blob/master/pairdist.m)

我的问题是:是否有一个有效的矢量化形式(Matlab,R或Julia很好)用于类似的计算,区别在于WTS是一组与A大小相同的权重向量?换句话说,代替1个权重向量,我需要A中每个点的1个权重向量.

这个答案似乎做了我需要的,但它是在Python中,我不知道如何将其转换为Matlab/R/Julia:https://stackoverflow.com/a/19285289/834518

此外,不是在MATLAB有效计算加权距离的重复,因为该问题涉及单个权重向量情况,并且我明确要求N个权向量情况.

编辑:示例应用:RBF网络和高斯混合模型,其中您(可以)为每个神经元/组件具有1个权重向量.解决问题的有效方法对于这些问题至关重要.

Chr*_*kas 5

在朱莉娅你不必将它矢量化为高效,只需编写循环,它将比这些矢量化形式更快,因为它可以融合并摆脱临时性.这是一个非常有效的实现成对应用在朱莉娅,你可以工作.它有所有的花里胡哨,但你可以根据需要配对它.

注意,矢量化不一定是"快速的",它只比在R/Python/MATLAB中循环更快,因为它只对一个用低级语言(C/C++)编写的优化内核进行单个函数调用,这实际上是循环的.但是将矢量化函数放在一起通常会有很多临时分配,因为每个矢量化函数都会返回数组.因此,如果你真的需要效率,你应该避免一般的矢量化,并用允许低成本函数调用/循环的语言编写它.这篇文章更多地解释了高级语言中矢量化的问题.

这回答了你遇到的三个问题之一.对于MATLAB或R,我没有一个好的答案.