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))