Рассчитать расстояние между каждой точкой матрицы друг с другом - PullRequest
0 голосов
/ 23 июня 2018

Я хочу вычислить евклидово расстояние между каждым элементом 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

Это действительно медленно и не работает - дает только одни.

1 Ответ

0 голосов

Я бы использовал 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)

Ouput:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...