2

我正在努力比较多个图像。我将这些图像数据作为称为“图像”的矩阵的列向量。我想通过首先计算它们的Eucledian距离来评估图像的相似性。然后我想创建一个矩阵,我可以执行多个随机游走。现在,我的代码如下:如何在MATLAB中创建一个相似矩阵?

% 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沿着它的主对角线和其他地方的零值结束。我期望每行的前几个元素的“大”值和列索引> 4的元素的“小”值。有人可以解释什么是错的?任何建议表示赞赏。

回答

0

您收到的结果看起来很合理。回想一下exp(-x)的行为。当x为零时,exp(-x)为1.当x很大时exp(-x)为零。也许如果你让M(i,j)= normImageTemp;你会看到你期望看到的。

2

由于您正在计算Euclidean distance,因此在计算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

考虑这样的解决方案:

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

相关:http://stackoverflow.com/q/11059274/97160,http://stackoverflow.com/q/7696734/97160,http://stackoverflow.com/q/6989442/97160 – Amro 2013-07-07 07:15:46

0

有一个已经实现的功能pdist,如果你有一个矩阵A,就可以直接做

辛= squareform(pdist(A))