如何从距离矩阵计算原始矢量?

时间:2011-02-20 06:11:38

标签: vector matrix mathematical-optimization linear-programming euclidean-distance

我对矢量和矩阵有一个小问题。

假设向量V = {v1,v2,...,vn}。我生成一个n乘n距离矩阵M,定义为:

M_ij = | v_i - v_j |这样我,j属于[1,n]。

也就是说,方阵中的每个元素M_ij是V中两个元素的绝对距离。

例如,我有一个向量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,如何确定初始归一化向量?

3 个答案:

答案 0 :(得分:1)

你做不到。为了让您了解原因,请考虑以下两种情况:

  

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]

正如您所看到的,单个M可能是多于一个V的结果。因此,您无法向后映射。

答案 1 :(得分: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]

答案 2 :(得分:0)

我认为找不到原始矢量是不可能的,但你可以通过取矩阵的第一行来找到矢量的平移。

如果你让M_ij = | v_i - v_j |并且你将在[1,n]中翻译所有v_k for k \ M_ij = | v-i + 1 - v_j + 1 |      = | v_i - v_j |

因此,只需将第一行作为向量,找到一个初始点将向量转换为。

校正:

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

按顺序为[2,n]中的k \所有v_k执行此操作将显示每个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}