-1

次のことを行うはずの関数を作成しました。

  • 入力として2セットを取る
  • ここpdist2に示されているコードを使用して、2 つのセット間の距離を取得します。
  • 最初は2セット間の距離を取ります。次に、2 番目のセットでは、反復ごとに (i,j) 位置が設定され、0この変更で距離が計算されます。次の繰り返しに進むとき、次の位置の値を「0」に変更すると同時に、「0」に設定されていた前の値を元の値に戻す必要があります。
  • からの結果はもともと行列として返されることに注意してください。ただしpdist2、比較のために、行列の値を合計して比較に使用します。

それに基づいて、次の関数を作成しました (ここpdist2.mのリンクから関数を使用できることに注意してください)。

   function m = pixel_minimize_distance(x,y)
    sum1=0;
    sum2=0;
    [r c] = size(y);
    d1 = pdist2(x,y);
    [r1 c1] = size(d1);
    for i=1:r1
    for j=1:c1
        sum1=sum1+d1(i,j);
    end
end
maximum = sum1;

for i=1:r
for j=1:c
o = y(i,j)
y(i,j) = 0;
d2 = pdist2(x,y);
[r2 c2] = size(d2);
for i=1:r2
    for j=1:c2
        sum2=sum2+d2(i,j);
    end
end

if sum2 >= maximum
    if o ~= 0
    maximum = sum2;
    m = o;
    end

end

if sum2 <= maximum
maximum = maximum;
end
y(i,j)=o;
end
end
end

さて、これは私がテストとして実行したものです:

>> A=[1 2 3; 6 5 4];
>> B=[4 5 3; 7 8 1];
>> pixel_minimize_distance(A,B)

o =

     4


o =

     4


o =

     1


o =

     7


o =

     7


o =

     0


ans =

     7

ここの答えを7見てください(見えない場合は下にスクロールしてください)が、これを手動で計算したときの期待値は、距離の合計に3設定すると になるため、0142

コードで何が間違っている可能性がありますか? o = y(i,j)設定のコードの場所にあると思いますが、元の値oを示しますが、実際にはそれを解決する方法を理解できませんでした。

ありがとう。

4

1 に答える 1

2

コードに冗長なコマンドがたくさんあると思います。私はそれらを削除しただけで、他には何もありません。masの値を取得しています3。ユークリッド距離の2乗でMATLABのpdist2関数を使用しました(これは、指定した関数のデフォルトであるため)。距離として142を取得しませんでした。

コードは次のとおりです。

function m = pixel_minimize_distance(x,y)
[r c] = size(y);
maximum = (sum(sum(pdist2(x,y)))).^2; %explained below

for i=1:r
    for j=1:c
        o = y(i,j);
        y(i,j) = 0
        sum2 = (sum(sum(pdist2(x,y)))).^2;


        if sum2 >= maximum
            if o ~= 0
                maximum = sum2;
                m = o;
            end
        end

        y(i,j)=o;
    end
end
end

出力は次のとおりです。

y =

 0     5     3
 7     8     1

y =

 4     0     3
 7     8     1

y =

 4     5     0
 7     8     1

y =

 4     5     3
 0     8     1

y =

 4     5     3
 7     0     1

y =

 4     5     3
 7     8     0

m =

 3

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%説明:次のコードスニペットを作成しました。

d2 = pdist2(x,y);
[r2 c2] = size(d2);
for i=1:r2
    for j=1:c2
        sum2=sum2+d2(i,j);
    end
end

これが単純に行うことは、を使用して2つのセット間の距離を計算し、pdist2距離行列全体を合計してsum2、ケースに格納されている1つの値を算出することです。私のコードを見てみましょう:

sum2 = (sum(sum(pdist2(x,y)))).^2;

pdist2距離を与えます。最初sumのコマンドは行に沿って合計し、次に2番目のコマンドは列に沿って合計して、マトリックス内のすべての値の合計を取得します(これは2つのforループで行ったことです)。さて、背後にある理由.^2は次のとおりです。提供したリンクの元のpdist2関数では、次のコードスニペットから確認できます。

if( nargin<3 || isempty(metric) ); metric=0; end;

switch metric
  case {0,'sqeuclidean'}

その2乗されたユークリッド距離がデフォルトの距離ですが、MATLABではユークリッド距離がデフォルトです。したがって、私はその用語を二乗しました。%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

于 2013-02-11T09:25:08.490 に答える