[英]MATLAB use custom function with pdist
我有一個自定義函數來計算圖像的兩個像素(代表圖形上的節點)之間的權重
function [weight] = getWeight(a,b,img, r, L)
ac = num2cell(a);
bc = num2cell(b);
imgint1 = img(sub2ind(size(img),ac{:}));
imgint2 = img(sub2ind(size(img),bc{:}));
weight = (sum((a - b) .^ 2) + (r^2/L) * abs(imgint2 - imgint1)) / (2*r^2);
其中a = [x1 y1]
和b = [x2 y2]
是表示圖像像素的坐標, img
是灰度圖像, r
和L
是常數。 在函數imgint1
和imgint2
是a
和b
上像素的灰度強度。
我需要計算圖像中各點之間的權重。
我想使用pdist函數,而不是兩個嵌套循環,因為它更快捷!
例如,讓nodes
一組像素坐標
nodes =
1 1
1 2
2 1
2 2
和img = [ 128 254; 0 255]
img = [ 128 254; 0 255]
, r = 3
, L = 255
為了獲得這些權重,我使用了一個中間函數。
function [weight] = fxIntermediate(a,b, img, r, L)
weight = bsxfun(@(a,b) getWeight(a,b,img,r,L), a, b);
為了最終獲得整套權重
distNodes = pdist(nodes,@(XI,XJ) fxIntermediate(XI,XJ,img,r,L));
但這總是讓我出錯
Error using pdist (line 373)
Error evaluating distance function '@(XI,XJ)fxIntermediate(XI,XJ,img,r,L)'.
Error in obtenerMatriz (line 27)
distNodes = pdist(nodes,@(XI,XJ) fxIntermediate(XI,XJ,img,r,L));
Caused by:
Error using bsxfun
Invalid output dimensions.
編輯1
這是我的代碼應該工作的簡短示例,但是出現了上面提到的錯誤。 如果在MATLAB上復制/粘貼代碼並運行代碼,您將看到錯誤
function [adjacencyMatrix] = problem
img = [123, 229; 0, 45]; % 2x2 Image as example
nodes = [1 1; 1 2; 2 2]; % I want to calculate distance function getWeight()
% between pixels img(1,1), img(1,2), img(2,2)
r = 3; % r is a constant, doesn't matter its meaning
L = 255; % L is a constant, doesn't matter its meaning
distNodes = pdist(nodes,@(XI,XJ) fxIntermediate(XI,XJ,img,r,L));
adjacencyMatrix = squareform(distNodes );
end
function [weight] = fxIntermediate(a,b, img, r, L)
weight = bsxfun(@(a,b) getWeight(a,b,img,r,L), a, b);
end
function [weight] = getWeight(a,b,img, r, L)
ac = num2cell(a);
bc = num2cell(b);
imgint1 = img(sub2ind(size(img),ac{:}));
imgint2 = img(sub2ind(size(img),bc{:}));
weight = (sum((a - b) .^ 2) + (r^2/L) * abs(imgint2 - imgint1)) / (2*r^2);
end
我的目標是獲得一個表示像素之間距離的鄰接矩陣。 對於上面的示例,所需的鄰接矩陣為:
adjacencyMatrix =
0 0.2634 0.2641
0.2634 0 0.4163
0.2641 0.4163 0
問題是,你既不履行一個函數的期望與使用pdist
,也沒有那些功能與使用bsxfun
。
–從pdist
的文檔中:
距離函數的形式必須為
d2 = distfun(XI,XJ)
以對應於X的單行的1×n向量XI和對應於X的多行的m2×n矩陣XJ作為參數。distfun必須接受具有任意行數的矩陣XJ。 distfun必須返回距離為d2的m2×1向量,其第k個元素是XI與XJ(k,:)之間的距離。
但是,通過在fxIntermediate
使用bsxfun
,此函數將始終返回值矩陣 ,其值大於兩個輸入的大小中的較大者。
–從bsxfun
的文檔中:
形式為C = fun(A,B)的二進制按元素函數接受任意但大小相等的數組A和B,並返回相同大小的輸出。 輸出數組C中的每個元素僅是對A和B的相應元素進行運算的結果。 fun還必須支持標量擴展,例如,如果A或B是標量,則C是將標量應用於其他輸入數組中的每個元素的結果。
但是,您的getWeight
似乎總是返回標量。
為了解決此問題,我不太了解您的問題。 而且,我認為,如果速度是您追求的目標, pdist
用功能句柄為pdist
供電pdist
的方法。 pdist
不執行魔術; 它之所以快,是因為它的內置距離功能得到了有效實施。 同樣,您正在使用匿名函數句柄以及與單元數組之間的轉換,所有這些都會減慢該過程。 我認為您應該發布一個新問題,從描述要計算的內容開始,包括一些即使效率低下也能完成工作的代碼,並提出如何改進它的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.