1

我有一个关于向量和矩阵的小问题。

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

M_ij = | v_i - v_j | 使得 i,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,如何确定初始归一化向量?

4

3 回答 3

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 的结果。因此,您不能向后映射。

于 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 |

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

更正:

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

对所有 v_k for 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 回答