2016-12-14 12 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次元の点と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です。左上隅の入力に非ゼロピクセルが1つしかないので、残りの画像はこのピクセルまでの距離を計算する必要があります。距離のデフォルトの方法はユークリッド距離です。

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); 

あなたがあなたの代わりにbsxfunバージョンを使用する必要があります、自動放送でMATLAB(またはオクターブ)の最新バージョンを使用していない場合:

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 
関連する問題