我对矢量和矩阵有一个小问题。
假设向量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,如何确定初始归一化向量?
答案 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}