到单点的距离
Distances from a single point
我想从一个点生成欧几里德距离矩阵 [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 的所有距离。
有没有简单可行的方法?
你可以使用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(或 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
由于您的最终目标与图像处理有关,因此我假设您拥有图像处理工具箱。您也可以使用 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,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 的所有距离。
有没有简单可行的方法?
你可以使用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(或 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
由于您的最终目标与图像处理有关,因此我假设您拥有图像处理工具箱。您也可以使用 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