【问题标题】:Compute the difference matrix between a matrix and another matrix in MATLAB在 MATLAB 中计算一个矩阵和另一个矩阵之间的差分矩阵
【发布时间】:2020-05-19 15:45:34
【问题描述】:

在matlab中给定一个矩阵A

3   1
4   5
7   8

还有另一个矩阵B,它可以被称为一些参考点(每一行都是要与A的每一行进行比较的参考点),

1   1
1   2

我需要计算一个矩阵C,这样

 4    5
25   18
85   72

C 的每一行是A 的每一行与B 的行之间的差值(平方L2 范数)。在 MATLAB 中执行此操作的一种可能方法是首先创建一个零矩阵CC = zeros(5,2),然后使用双 for 循环填充适当的值。 MATLAB 中还有其他更高效/更简单的方法吗?

在下面找到代码sn-p

C = zeros(5,2)
for i = 1:rows
    for j = 1:rows2
        C(i,j) =  (norm(A(i,:)-B(j,:)))^2
    end
end

【问题讨论】:

    标签: arrays matlab matrix distance euclidean-distance


    【解决方案1】:

    也许你可以试试bsxfun,如下所示

    A = [3,1; 4,5;7,8];
    B = [1,1;1,2];
    
    % you can first rewrite A and B in complex coordinates to simplify the computation, and then compute difference of two complex values
    C = abs(bsxfun(@minus,A*[1;1j],transpose(B*[1;1j]))).^2;
    

    你会得到

    C =
    
        4.0000    5.0000
       25.0000   18.0000
       85.0000   72.0000
    

    【讨论】:

    • 看起来又短又简单!当我要计算高斯相似度而不是欧几里得距离时会发生什么,K_rbf = exp(-(norm(A(1,:)-B(2,:))^2)/(2*sigma^2))sigma 是每个点之间的欧几里得距离。
    • @JesujobaALABI 是sigma 矩阵C 作为欧几里得距离矩阵?如果是的话,也许你应该试试K_rbf = exp(-(norm(A(1,:)-B(2,:))^2)./(2*C))
    • Sigma 可以看作是我们之前计算的 C。使用 K_rbf = exp(-(norm(A(1,:)-B(2,:))^2)./(2*C)) 意味着我仍然会使用 2 个 for 循环和零矩阵的初始化,对吗?但是,当 sigma 只是一个标量时,我可以使用C = exp((abs(bsxfun(@minus,A*[1;1j],transpose(B*[1;1j]))).^2)/2*sigma); 吗?
    • @JesujobaALABI 是的,当sigma 是标量时,您可以这样做
    【解决方案2】:

    类似于ThomasIsCoding's 的解决方案,但可以推广到任意数量的维度(=列)。 Thomas 的回答要求 AB 恰好有 2 列来使用复杂表示。在这里,我们使用第三个数组维度而不是复数值:

    n = 3; % number of spatial dimensions for computing the L2 norm
    A = 10*rand(20,n);
    B = 10*rand(4,n);
    C = sum((reshape(A,[],1,n) - reshape(B,1,[],n)).^2,3)
    

    首先我们重塑A,使其行保持为行,但其列沿数组的第三维排列。我们以类似的方式重塑B,但它的行变成了列,并且它的列被移动到了第三维。前两个维度的这种排列与输出 C 的排列相匹配。

    接下来我们沿第三维取差值(使用隐式单例展开,对于旧版本的 MATLAB,您需要使用 bsxfun)、平方和求和。

    【讨论】:

    • n = 3; % number of dimensions这不是列数吗?
    • @Daniel:是的,它是欧几里得距离计算中的维数。我看到我以两种不同的方式使用“维度”......让我看看我是否可以解决这个问题。
    • 看起来很酷!当我要计算高斯相似度而不是欧几里得距离时会发生什么情况,K_rbf = exp(-(norm(A(1,:)-B(2,:))^2)/(2*sigma^2))
    • @JesujobaALABI: C 是平方范数,所以你只需要做exp(-C/(2*sigma^2))
    猜你喜欢
    • 1970-01-01
    • 2020-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-11
    • 2015-06-16
    • 1970-01-01
    相关资源
    最近更新 更多