2016-12-14 76 views
1

我正在尋找從一個點[1,1]生成歐氏距離矩陣。這是我的,但它沒有按預期工作:單點的距離

a=rand(10,10); 
a=sort(a); %sort example matrix it should be visible that distances should get bigger and bigger 
a=pdist([ones(size(a));a]); 

請想象10x10矩陣作爲圖像。我想得到從A點(這裏[1,1])到一系列其他點的距離,即整個矩陣。所以預期的格式將是原始矩陣10x10大小,但所有的距離到點A.

有沒有一種簡單的方法來做到這一點?

+0

所以,你怎麼建議你要計算10 dimensinal點和2維點之間的距離? – Suever

+1

您在最後一行缺少括號。 – beaker

+0

所以我認爲每個索引[x,y]都有一個值。我只是希望該值與[1,1]的距離。這是否更有意義? – user2305193

回答

3

因爲你的最終目標是與圖像處理,我假設你有圖像處理工具箱。您也可以使用bwdist,並將輸入的左上角設置爲true,然後讓其填充剩餘部分。請注意,輸入是二進制圖像。

A = false(10, 10); 
A(1, 1) = true; 
B = bwdist(A); 

bwdist計算其中輸出的每個位置被設定爲使得如果相應輸入位置是false,從該位置到最接近的非零像素的距離計算distance transform。對於true的位置,輸出自然是0.由於左上角的輸入中只有一個非零像素,因此圖像的其餘部分應計算與此像素的距離。距離的默認方法是你所追求的歐幾里德距離。

另請注意,返回的類型bwdistsingle或單精度浮點型。根據您的應用程序,轉換爲完整的double這是默認的MATLAB數字數據類型可能是首選。只需使用double函數投射輸出。

B = double(bwdist(A)); 

示例執行

>> A = false(10, 10); 
>> A(1,1) = true; 
>> B = double(bwdist(A)) 

B = 

     0 1.0000 2.0000 3.0000 4.0000 5.0000 6.0000 7.0000 8.0000 9.0000 
    1.0000 1.4142 2.2361 3.1623 4.1231 5.0990 6.0828 7.0711 8.0623 9.0554 
    2.0000 2.2361 2.8284 3.6056 4.4721 5.3852 6.3246 7.2801 8.2462 9.2195 
    3.0000 3.1623 3.6056 4.2426 5.0000 5.8310 6.7082 7.6158 8.5440 9.4868 
    4.0000 4.1231 4.4721 5.0000 5.6569 6.4031 7.2111 8.0623 8.9443 9.8489 
    5.0000 5.0990 5.3852 5.8310 6.4031 7.0711 7.8102 8.6023 9.4340 10.2956 
    6.0000 6.0828 6.3246 6.7082 7.2111 7.8102 8.4853 9.2195 10.0000 10.8167 
    7.0000 7.0711 7.2801 7.6158 8.0623 8.6023 9.2195 9.8995 10.6301 11.4018 
    8.0000 8.0623 8.2462 8.5440 8.9443 9.4340 10.0000 10.6301 11.3137 12.0416 
    9.0000 9.0554 9.2195 9.4868 9.8489 10.2956 10.8167 11.4018 12.0416 12.7279 
+2

我完全忘記了'bwdist':D – beaker

+0

@beaker:D直到我看到評論時才發生這種情況。 OP只是想要距離轉換。 – rayryeng

+0

真棒,我沒有找到功能!謝謝! – user2305193

2

你可以使用pdist2要做到這一點,但你必須拿到網格座標,計算出的距離,然後重新安排它放回矩陣,所以我就直接計算的距離:

point = [1 1]; % point to calculate distance from 
imgRows = 10; % grid size 
imgCols = 10; 

a = sqrt(([1:imgRows].' - point(1)).^2 + ([1:imgCols] - point(2)).^2); 

如果你不使用最新版本的MATLAB(或八度)具有自動廣播的,你需要使用bsxfun版本而不是:

a = bsxfun(@(x,y) sqrt(x.^2 + y.^2), ([1:imgRows] - point(1)).', ([1:imgCols] - point(2))); 

結果:

a = 

    0.00000 1.00000 2.00000 3.00000 4.00000 5.00000 6.00000 7.00000 8.00000 9.00000 
    1.00000 1.41421 2.23607 3.16228 4.12311 5.09902 6.08276 7.07107 8.06226 9.05539 
    2.00000 2.23607 2.82843 3.60555 4.47214 5.38516 6.32456 7.28011 8.24621 9.21954 
    3.00000 3.16228 3.60555 4.24264 5.00000 5.83095 6.70820 7.61577 8.54400 9.48683 
    4.00000 4.12311 4.47214 5.00000 5.65685 6.40312 7.21110 8.06226 8.94427 9.84886 
    5.00000 5.09902 5.38516 5.83095 6.40312 7.07107 7.81025 8.60233 9.43398 10.29563 
    6.00000 6.08276 6.32456 6.70820 7.21110 7.81025 8.48528 9.21954 10.00000 10.81665 
    7.00000 7.07107 7.28011 7.61577 8.06226 8.60233 9.21954 9.89949 10.63015 11.40175 
    8.00000 8.06226 8.24621 8.54400 8.94427 9.43398 10.00000 10.63015 11.31371 12.04159 
    9.00000 9.05539 9.21954 9.48683 9.84886 10.29563 10.81665 11.40175 12.04159 12.72792