【问题标题】:Calculate distance between every point of matrix with each other计算矩阵每个点之间的距离
【发布时间】:2018-12-02 19:57:31
【问题描述】:

我想计算一个 n 通道矩阵的每个元素之间的欧几里得距离,然后将函数 exp(-dist) 应用于它。我的矩阵是 MxN,所以输出必须是 (MxN)x(MxN)。

这是我目前的代码:

MAX=M*N;
A = zeros([MAX,MAX]);
dist= zeros([MAX,MAX]);
for x1=1:MAX
  for x2=1:MAX
    for i=1:M
      for j=1:N
        for s=1:M
          for z=1:N
            %every pixel is a vector rgb
            dist(x1,x2) = norm((imIn(i,j)-imIn(s,z)),3);
            A(x1,x2) = exp(-dist);
          end
        end
      end
    end
  end
end

它真的很慢而且不起作用 - 它只给出一个。

【问题讨论】:

  • 您在这里问了很多问题,但没有接受任何一个答案。接受答案有助于未来的访问者知道答案有效。考虑回顾一下,通过单击答案左侧的 ,在您的每个问题中将解决您问题的最有用的答案标记为accepted。每个问题的一个答案可以标记为已接受。您也可以点击答案左侧的 upvote 所有有用的答案。这将奖励志愿者应得的奖励。
  • 当你写了这么多 for 循环时,你的想法是什么?
  • 我猜缺乏灵感
  • 你为什么要问欧几里得距离和n通道,但同时给出一个只有1个通道的例子?我是否遗漏了什么,或者您的输入实际上是MxNxC?您是否打算将您获得的任何解决方案循环应用到每个渠道?

标签: image matlab matrix euclidean-distance pairwise


【解决方案1】:

我会使用bsxfun:
*请注意,由于距离应用于标量值,所以我只使用 abs(a-b)。调用 norm() 没有意义,它只是死时间。

m = 3;
n = 4;
ImIn = rand(m,n)
% first transform to vector
vector = ImIn(:)
% edit: better solution for older versions, see comments
Distances = abs(bsxfun(@minus, vector', vector))
% for latest matlab versions
Distances = abs(vector'- vector)

输出:

ImIn =

    0.5833    0.9747    0.6369    0.6378
    0.4217    0.2235    0.6486    0.4072
    0.6525    0.1869    0.2085    0.5017


vector =

    0.5833
    0.4217
    0.6525
    0.9747
    0.2235
    0.1869
    0.6369
    0.6486
    0.2085
    0.6378
    0.4072
    0.5017


Distances =

         0    0.1616    0.0693    0.3915    0.3597    0.3964    0.0536    0.0654    0.3747    0.0546    0.1761    0.0816
    0.1616         0    0.2308    0.5530    0.1982    0.2348    0.2152    0.2269    0.2132    0.2161    0.0145    0.0800
    0.0693    0.2308         0    0.3222    0.4290    0.4656    0.0156    0.0039    0.4440    0.0147    0.2453    0.1508
    0.3915    0.5530    0.3222         0    0.7512    0.7879    0.3379    0.3261    0.7662    0.3369    0.5675    0.4731
    0.3597    0.1982    0.4290    0.7512         0    0.0366    0.4134    0.4251    0.0150    0.4143    0.1837    0.2782
    0.3964    0.2348    0.4656    0.7879    0.0366         0    0.4500    0.4618    0.0217    0.4509    0.2203    0.3148
    0.0536    0.2152    0.0156    0.3379    0.4134    0.4500         0    0.0117    0.4284    0.0009    0.2297    0.1352
    0.0654    0.2269    0.0039    0.3261    0.4251    0.4618    0.0117         0    0.4401    0.0108    0.2414    0.1469
    0.3747    0.2132    0.4440    0.7662    0.0150    0.0217    0.4284    0.4401         0    0.4293    0.1987    0.2932
    0.0546    0.2161    0.0147    0.3369    0.4143    0.4509    0.0009    0.0108    0.4293         0    0.2306    0.1361
    0.1761    0.0145    0.2453    0.5675    0.1837    0.2203    0.2297    0.2414    0.1987    0.2306         0    0.0945
    0.0816    0.0800    0.1508    0.4731    0.2782    0.3148    0.1352    0.1469    0.2932    0.1361    0.0945         0

检查:

>> size(ImIn)

ans =

     3     4

>> size(Distances)

ans =

    12    12

【讨论】:

  • 这太棒了!非常感谢!!
  • @ChristinaJ:如果很精彩,请点击答案左侧的复选标记。这使回答者的工作得到认可,并将向社区表明问题已得到回答。防止我们在上面浪费更多时间。正如 Sardar 所说,请检查您的旧问题并接受有帮助的答案。非常感谢!
  • @ChristinaJ 请注意,bsxfun 在这种情况下什么都不做,因为它使用不正确。如果您使用不带隐式扩展的 MATLAB 版本,A-B 将无法计算。试试abs(V-V.'),你会发现它同样有效。要正确使用bsxfun,您应该使用out = abs(bsxfun(@minus,V,V.')),其中@minusbsxfun's supported functions list 中列出的功能之一。 bsxfun 不只是你围绕任意表达式来“神奇地修复”不兼容的尺寸错误。
  • A-B 在每个 matlab 版本中都是可计算的。我的版本没有隐式扩展。我同意你的 bsxfun 使用更好一点。但请注意,在较旧的 matlab 版本中,您会得到:vector - vector.' `Error using -`Matrix dimensions must agree.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-13
  • 2016-11-29
  • 2011-09-21
  • 1970-01-01
  • 2013-12-16
  • 2018-03-23
  • 2016-10-30
相关资源
最近更新 更多