Как создать матрицу подобия в MATLAB? - PullRequest
2 голосов
/ 13 ноября 2010

Я работаю над сравнением нескольких изображений. У меня есть эти данные изображения как векторы столбцов матрицы, называемой «изображения». Я хочу оценить сходство изображений, сначала вычислив их евклидово расстояние. Затем я хочу создать матрицу, по которой я могу выполнить несколько случайных прогулок. Прямо сейчас мой код выглядит следующим образом:

% clear
% clc
% close all
% 
% load tea.mat;

images = Input.X;

M = zeros(size(images, 2), size (images, 2));

for i = 1:size(images, 2)
    for j = 1:size(images, 2)
        normImageTemp = sqrt((sum((images(:, i) - images(:, j))./256).^2));

        %Need to accurately select the value of gamma_i
        gamma_i = 1/10;

        M(i, j) = exp(-gamma_i.*normImageTemp);
    end 
end

Однако моя матрица M имеет значение 1 вдоль ее главной диагонали и нули в других местах. Я ожидаю "большие" значения для первых нескольких элементов каждой строки и "маленькие" значения для элементов с индексом столбца> 4. Может кто-нибудь объяснить, что не так? Любой совет приветствуется.

Ответы [ 4 ]

2 голосов
/ 13 ноября 2010

Так как вы пытаетесь вычислить евклидово расстояние , похоже, у вас есть ошибка в том, где ваши скобки помещаются при вычислении normImageTemp.У вас есть это:

normImageTemp = sqrt((sum((...)./256).^2));
                  %# ^--- Note that this parenthesis...

Но вы действительно хотите сделать это:

normImageTemp = sqrt(sum(((...)./256).^2));
                  %#    ^--- ...should be here

Другими словами, вам нужно выполнить поэлементное возведение в квадрат, затем суммация, затем квадратный корень.То, что вы делаете сейчас, - это сначала суммирование элементов, , а затем возведение в квадрат и извлечение квадратного корня из суммирования, которые, по сути, компенсируют друг друга (или фактически эквивалентны простому получению абсолютного значения).

Кстати, вы можете использовать функцию NORM , чтобы выполнить эту операцию для вас, например:

normImageTemp = norm((images(:, i) - images(:, j))./256);
0 голосов
/ 01 августа 2013

есть уже реализованная функция pdist, если у вас есть матрица A, вы можете напрямую сделать

Sim = квадратная форма (pdist (A))

0 голосов
/ 13 ноября 2010

Рассмотрим это решение:

I = Input.X;

D = squareform( pdist(I') );       %'# euclidean distance between columns of I
M = exp(-(1/10) * D);              %# similarity matrix between columns of I

PDIST и SQUAREFORM являются функциями из панели инструментов статистики.

В противном случае рассмотрим этот эквивалентный векторизованный код (используя только встроенные функции):

%# we know that: ||u-v||^2 = ||u||^2 + ||v||^2 - 2*u.v
X = sum(I.^2,1);
D = real( sqrt(bsxfun(@plus,X,X')-2*(I'*I)) );
M = exp(-(1/10) * D);

Как объяснялось в других ответах, D - это матрица расстояний, тогда как exp(-D) - это матрица подобия (поэтому вы получаете их по диагонали)

0 голосов
/ 13 ноября 2010

Результаты, которые вы получаете, кажутся разумными.Вспомните поведение exp (-x).Когда x равен нулю, exp (-x) равно 1. Когда x большое, exp (-x) равно нулю.

Возможно, если вы сделаете M (i, j) = normImageTemp;вы увидите то, что ожидаете увидеть.

...