我正在开发一个小小的益智游戏项目。基本思想是围绕将多维数据投影到2D而构建的。我唯一的问题是如何生成随机方案数据。这是问题所在:
我得到了多个随机向量v_i
和一个目标向量t
,所有这些都是2D。现在我想随机化标量值c_i
:
t = sum c_i v_i
因为有两个以上v_i
这是一个超定系统。我还注意到v_i
的线性组合实际上能够达到t
。
如何为c_i
创建(随机化)值?
编辑:找到this Question之后我还可以说,我也可以(稍微)更改v_i
。
所有值均基于double
答案 0 :(得分:1)
由于v_i是线性相关的,因此存在0 = sum l_i v_i的非平凡解。 如果你有n个向量,你可以找到n-2个独立的解决方案。
如果你现在有一个t = sum c_i v_i的解决方案,你可以将任何多个l_i添加到c_i,你仍然可以得到一个解决方案:c_i'= p l_i + c_i。
对于同质问题的每个独立解,确定随机p_j并计算 c_i''= c_i + sum p_j l_i_j。
答案 1 :(得分:1)
假设您的v_i
形成一个包含2行和n列的矩阵V
,每个向量都是一列。系数c_i
形成列向量c
。然后,等式可以以矩阵形式写成
V×c = t
现在将Singular Value Decomposition应用于矩阵V
:
V = A×D×B
其中A是正交2×2矩阵,D是2×n矩阵,B是正交n×n矩阵。原方程现在变为
A×D×B×c = t
将此等式乘以A的倒数,倒数与转置矩阵AT
相同:
D×B×c = AT×t
让我们介绍新的符号c'=B×c
和t'=AT×t
:
D×c' = t'
这个等式的解决方案很简单,因为矩阵D
看起来像这样:
u 0 0 0 ... // n columns
0 v 0 0 ...
解决方案是
c1' = t1' / u
c2' = t2' / v
由于D
的所有其他列都为零,因此可以自由选择剩余的组件c3'...cn'
。 这是您可以为c3'...cn
创建随机数的地方。拥有向量c'
,您可以将c
计算为
c = BT×c'
BT
是B
的反转/转置。