2016-12-14 3 views
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]); 

이미지로 10 × 10 행렬을 상상하십시오 : 이것은 내가, 그러나 그것은 의도 한대로 작동하지 않은 것입니다. 나는 점 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입니다. 왼쪽 위 모서리의 입력에 0이 아닌 픽셀이 하나 있기 때문에 나머지 이미지는이 픽셀까지의 거리를 계산해야합니다. 거리의 기본 방법은 유클리드 거리입니다.

또한 bwdist의 반환 유형은 single이거나 단 정밀도 부동 소수점입니다. 응용 프로그램에 따라 기본 MATLAB 숫자 데이터 형식 인 전체 double으로 변환하는 것이 좋습니다. 출력을 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))); 

결과 :

,536,913,632를 10
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