我希望从一个点[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 :(得分:3)
由于您的最终目标与图像处理有关,因此我假设您拥有图像处理工具箱。您也可以使用bwdist
并将输入的左上角设置为true
,然后让其填写其余内容。请注意,输入是二进制图像。
A = false(10, 10);
A(1, 1) = true;
B = bwdist(A);
bwdist
计算设置输出的每个位置的distance transform,以便相应的输入位置为false
时,从该位置到最近的非零像素的距离为计算。对于true
的位置,输出自然为0.由于左上角的输入中只有一个非零像素,因此图像的其余部分应计算到该像素的距离。距离的默认方法是欧几里德距离,这是你所追求的。
另请注意,返回的bwdist
类型为single
或单精度浮点数。根据您的应用程序,可能首选转换为完整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
答案 1 :(得分:2)
您可以使用pdist2
来做到这一点,但是您必须获取网格坐标,计算距离然后将其重新排列回矩阵,所以我只是直接计算距离:< / p>
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(或Octave)进行自动广播,则需要使用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