2016-12-14 110 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