2016-12-15 20 views
0

構造体データ型の距離を計算しようとしています。構造体データの割り当て

距離法は:

function ssd=distances(x, c) 
    m=size(x,1); 
    ssd = zeros(m, k); 
    k=size(c,1); 

    for i= 1:k 
    z = bsxfun(@minus,x, c(i,:)); 
    ssd(:,i) = sqrt(z(:).^2,2); 
end 

そしてIは以下の式から生成された乱数であるc有する:

for i=1:20 
    pop(i).Position=unifrnd(2,2,4); 
    pop(i).dist=distances(x= data,pop(i).Position=c); 
end 

X =データが100x2されます。

問題は、渡された引数であるpop(i).positionを受け入れないdistanceメソッドを呼び出すときです。私が作ることができ

+0

引数を?また、あなたはどこでも定義されていない変数 'k'を使用しています。明確にするために質問を編集してください。 –

+0

なぜあなたは関数呼び出しに 'x ='と '= c'を持っていますか? 'distance(data、pop(i).Position)はどうでしょうか? – Suever

+0

@Suever、はい、xはデータ、cはpop(i).positionであることを説明するためのものです。 –

答えて

0

いくつかのエラーと提案:

  1. sqrt機能のみ単一の入力パラメータを受け入れます。 2つの入力パラメーターを指定しています。

  2. また、SSDの権利も計算されていません。 z = bsxfun(...);を実行する場合は、dataと入力クエリポイントc(i, :)のコンポーネント間の距離を単純に計算します。 の合計であるには、コンポーネント間の距離もすべて含まれていなければなりません。あなたはおそらく同様にsqrtに加えてsumを追加することを意図しているため、あなたのsqrt関数呼び出しが間違っている理由は、おそらくです:

    ssd(:, i) = sqrt(sum(z.^2, 2)); 
    

    ところで、平方差の合計は、伝統的理由です.... sqrt操作が含まれていません。 の合計がとなり、の角がとなります。

  3. また、あなたのメインループでこのコードは、任意の意味をなさない:

    pop(i).dist=distances(x= data,pop(i).Position=c) 
    

    私の推測では、あなたがキーと値のペアとして入力を指定することができますPythonの背景から来ているということです。それをしないでください。ちょうどん:

    pop(i).dist = distance(data, pop(i).Position); 
    
  4. このコードpop(i).Position=unifrnd(2,2,4);は意味を成さない... 2及び2の値の間の4×4行列を生成します。あなたのデータが持つ機能の数に合わせて4 x 2の行列を生成したかったでしょう。何か他のものを使用し、乱数の範囲を大きくする。これを4 x 2にするには、追加の引数を指定します。このような何かは仕事ができる:

    pop(i).Position = unifrnd(2, 10, 4, 2); 
    
+0

私はあなたが示唆した変更を加えましたが、まだエラーがあります。エラーbsxfunを使用しています 2つの入力配列の非シングルトン寸法は互いに一致している必要があります。 –

+0

z = bsxfun(@マイナス、x、c(i、:)); –

+0

編集を確認してください。特に#4。 'unifrnd'へのあなたの呼び出しは全く意味がありません。 – rayryeng

関連する問題