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

Vector 如何从距离矩阵计算原始向量?,vector,matrix,mathematical-optimization,linear-programming,euclidean-distance,Vector,Matrix,Mathematical Optimization,Linear Programming,Euclidean Distance,我有一个关于向量和矩阵的小问题 假设一个向量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 0;] 这似乎很简单。现在是问题。给定这样一个矩阵M,如何得到初始V 多谢各位 从这个问题的一些答案来看,答案似乎不是唯一的。

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

假设一个向量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 0;]

这似乎很简单。现在是问题。给定这样一个矩阵M,如何得到初始V

多谢各位


从这个问题的一些答案来看,答案似乎不是唯一的。现在假设所有的初始向量都被归一化为0均值和1方差。问题是:给定这样一个对称的距离矩阵M,如何确定初始归一化向量?

你不能。为了让你知道为什么,考虑这两种情况:

V1={1,2,3}

M1=[0112;1011;2110]

V2={3,4,5}

M2=[0112;1011;2110]


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

我认为不可能找到原始向量,但您可以通过获取矩阵的第一行来找到向量的平移

如果你让M|ij=|v|i-v|j |把[1,n]中所有的v|k都翻译成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

因为距离矩阵对于向所有元素添加常数和将所有值乘以-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]
#假设v[1]为0
v[1]=0
#e是第一个非零向量元素的值
e=0
#ei是第一个非零向量元素的索引
ei=0
对于i=2…n:
#如果到目前为止所有向量元素都为0
如果e==0:
#获取与元素1及其索引的当前距离
#此新元素可能仍然为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]=-d[1,i]
其他:
#其他一些情况;v[i]在v[1]的右边
v[i]=d[1,i]

这会中断,因为一些向量值可能是负数(当v[1]标准化为0时),而这不会出现在矩阵的第一行。哦,是的,你说得对。我想你能做的最好的事情就是找出哪个v_k具有相同的奇偶性。例如,从第一行+/-v_k中知道所有k>1(让v_1=0),然后从| v_a-v_b |=M|ab中可以找到它们是否具有相似的奇偶校验(这将导致两个向量彼此相反)谢谢@Yuuta的回答。这很有启发性。但是我不明白你在评论中的意思。对不起,我在更新我的答案之前发表了评论。可以得到向量的转置,但原点和方向未知。例如,您可以找到{0,v_2,v_3…}但对于某些t,原始向量是s*{0+t,v_2+t,v_3+t…},其中s是+/-1,如果任何初始向量被归一化为0平均值和1方差呢?您是否可以在代码中添加一些注释?非常感谢。@sunjerry:这里的“均值”和“方差”是什么意思?也许最好将任何初始向量归一化为0均值和1方差。我会在问题中加入这项规定。
# 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]