我目前正在编写一个函数来为 3D 空间中的一组点找到一个“精确”的边界球。到目前为止,我认为我对这个过程有一个不错的理解,但我陷入了困境。
这是我正在使用的内容:A) 3D 空间中的点 B) 存储在 4x4 矩阵类中的 3x3 协方差矩阵(由单元格 m0、m1、m2、m3、m4 等引用;而不是行和列)
我已经找到了点的协方差矩阵的 3 个特征值,并且我已经设置了一个函数来通过高斯消元将矩阵转换为简化的行梯形 (rref)。
我已经根据我在网上找到的示例中的数字测试了这两个功能,它们似乎工作正常。
下一步是使用以下等式找到特征向量: (M - λ*I)*V
... 其中 M 是协方差矩阵,λ 是特征值之一,I 是单位矩阵,V 是特征向量。
但是,在 rref 之前,我似乎没有正确构造 4x3 矩阵,因为在运行 rref 之前和之后应该计算特征向量分量的最右边的列是 0。我理解为什么它们之后为零(没有任何常数,线性方程组的最简单解决方案是所有系数为零),但我不知道该放什么。
这是到目前为止的功能:
Vect eigenVector(const Matrix &M, const float eval) { 矩阵 A = 矩阵(M); A -= 矩阵(IDENTITY)*eval; A.rref(); 返回 Vect(A[m3],A[m7],A[m11]); }
3x3 协方差矩阵作为 M 传递,特征值作为 eval 传递。Matrix(IDENTITY) 返回一个单位矩阵。m3、m7 和 m11 对应于 4x3 矩阵的最右列。
这是我用来测试函数的示例 3x3 矩阵(存储在 4x4 矩阵类中):
矩阵(1.5f, 0.5f, 0.75f, 0, 0.5f, 0.5f, 0.25f, 0, 0.75f, 0.25f, 0.5f, 0, 0, 0, 0, 0);
我正确(?)从我的其他函数中获取 2.097、0.3055、0.09756 的特征值。
上面的 eigenVector() 正确地从对角线 (0,0 1,1 2,2) 中减去传递的特征值
rref() 后的矩阵 A:
[(1, 0, 0, -0), (-0, 1, 0, -0), (-0, -0, 1, -0), (0, 0, 0, -2.09694)]
对于 rref() 函数,我使用的是在这里找到的翻译后的 python 函数:http: //elonen.iki.fi/code/misc-notes/python-gaussj/index.html
我传递给 rref() 的矩阵应该是什么样子才能得到一个特征向量?
谢谢