1

ベクトルと行列についてちょっとした質問があります。

ベクトル V = {v1, v2, ..., vn} とします。次のように定義された n 行 n 列の距離行列 M を生成します。

M_ij = | v_i - v_j | i、jが[1、n]に属するように。

つまり、正方行列の各要素 M_ij は、V の 2 つの要素の絶対距離です。

たとえば、ベクトル V = {1, 3, 3, 5} がある場合、距離行列は M=[ 0 2 2 4; になります。2 0 0 2; 2 0 0 2; 4 2 2 0; ]

とてもシンプルに思えます。ここで問題になります。このような行列 M が与えられた場合、初期 V を取得するにはどうすればよいでしょうか?

ありがとうございました。

この質問に対するいくつかの回答に基づいて、答えは一意ではないようです。したがって、すべての初期ベクトルが平均 0、分散 1 に正規化されているとします。問題は、このような対称距離行列 M が与えられた場合、正規化された初期ベクトルをどのように決定するかです。

4

3 に答える 3

1

できません。理由を理解するために、次の 2 つのケースを考えてみましょう。

V1 = {1,2,3}

M1 = [ 0 1 2 ; 1 0 1 ; 2 1 0 ]

V2 = {3,4,5}

M2 = [ 0 1 2 ; 1 0 1 ; 2 1 0 ]

ご覧のとおり、1 つの M は複数の V の結果である可能性があります。したがって、逆方向にマッピングすることはできません。

于 2011-02-20T06:19:42.857 に答える
1

距離行列は、すべての要素に定数を加算し、すべての値に -1 を掛けても不変であるため、答えを一意に決定する方法はありません。ただし、要素 1 が 0 に等しく、最初の非ゼロ要素が正であると仮定すると、答えを見つけることができます。擬似コードは次のとおりです。

# Assume v[1] is 0
v[1] = 0
# e is value of first non-zero vector element
e = 0
# ei is index of first non-zero vector element
ei = 0
for i = 2...n:
  # if all vector elements have been 0 so far
  if e == 0:
    # get the current distance from element 1 and its index
    # this new element may still be 0
    e = d[1,i]
    ei = i
    v[i] = e
  elseif d[1,i] == d[ei,i] + v[ei]: # v[i] <= v[1]
    # v[i] is to the left of v[1] (assuming v[ei] > v[1])
    v[i] = -d[1,i]
  else:
    # some other case; v[i] is to the right of v[1]
    v[i] = d[1,i]
于 2011-02-20T06:23:23.370 に答える
0

元のベクトルを見つけることはできないと思いますが、行列の最初の行を取得することでベクトルの翻訳を見つけることができます。

M_ij = | とすると、v_i - v_j | すべての v_k を k\in [1,n] に変換すると、M_ij = | が得られます。vi + 1 - v_j + 1 | = | v_i - v_j |

したがって、最初の行をベクトルとして取得し、ベクトルを変換する最初のポイントを 1 つ見つけます。

修正:

Let v_1 = 0, and let l_k = | v_k | for k\in [2,n] and p_k the parity of v_k

Let p_1 = 1

for(int i = 2; i < n; i++)
   if( | l_i - l_(i+1) | != M_i(i+1) )
      p_(i+1) = - p_i
   else
      p_(i+1) = p_i

k\in [2,n] のすべての v_k に対してこれを順番に実行すると、各 v_k の他のものに対するパリティが表示されます

次に、同じ方向または反対方向の元のベクトルの翻訳を見つけることができます

更新 (正規化されたベクトルの場合):

  Let d = Sqrt(v_1^2 + v_2^2 + ... + v_n^2)

  Vector = {0, v_1 / d, v_2 / d, ... , v_n / d}
            or
           {0, -v_1 / d, -v_2 / d, ... , -v_n / d}
于 2011-02-20T06:23:08.327 に答える