簡體   English   中英

MATLAB將自定義函數與pdist一起使用

[英]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是灰度圖像, rL是常數。 在函數imgint1imgint2ab上像素的灰度強度。

我需要計算圖像中各點之間的權重。

我想使用pdist函數,而不是兩個嵌套循環,因為它更快捷!

例如,讓nodes一組像素坐標

nodes  =
 1     1
 1     2
 2     1
 2     2

img = [ 128 254; 0 255] img = [ 128 254; 0 255]r = 3L = 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM