我目前正在编写一个函数来为3D空间中的一组点找到“精确”的边界球体。我认为到目前为止我对这个过程有一个很好的理解,但我已经卡住了。
以下是我正在使用的内容: A)3D空间中的点 B)存储在4x4矩阵类中的3x3协方差矩阵(由单元格m0,m1,m2,m3,m4,ect引用;而不是行和列)
我已经找到了点的协方差矩阵的3个特征值,并且我已经建立了一个函数,通过高斯消元法将矩阵转换为精简行梯形(rref)。
我已经在网上找到的示例中对这两个函数进行了测试,看起来它们运行正常。
下一步是使用以下等式找到特征向量: (M - λ* I)* V
...其中M是协方差矩阵,λ是特征值之一,I是单位矩阵,V是特征向量。
然而,我似乎没有在rref之前正确构造4x3矩阵,因为在运行rref之前和之后应该计算特征向量分量的最右列是0。我理解为什么它们之后为零(没有任何常数,线性方程组的最简单解是所有系数为零),但是我不知道该放在那里。
这是迄今为止的功能:
Vect eigenVector(const Matrix &M, const float eval) { Matrix A = Matrix(M); A -= Matrix(IDENTITY)*eval; A.rref(); return Vect(A[m3],A[m7],A[m11]); }
3x3协方差矩阵作为M传递,特征值作为eval传递。 Matrix(IDENTITY)返回一个单位矩阵。 m3,m7和m11对应于4x3矩阵的最右列。
以下是我用来测试函数的示例3x3矩阵(存储在4x4矩阵类中):
Matrix(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()的矩阵应该是什么样才能得到一个特征向量?
由于
答案 0 :(得分:1)
(M - λI)V不是一个等式,它只是一个表达式。但是,(M-λI)V = 0。它是将特征向量与特征值联系起来的等式。
假设你的rref
函数有效,我会想象你创建一个增强矩阵为[(M - λI) | 0]
,其中0
表示零向量。这听起来就像你已经在做的那样,所以我不得不假设你的rref
功能被打破了。或者,它不知道如何处理4x4矩阵(而不是4x3矩阵,这是增益矩阵的预期)。
答案 1 :(得分:1)
问题在于没有“一组”特征向量,而是具有不同幅度的无限数。
我选择的方法是使用REF(行梯形形式)而不是RREF,在矩阵中留下足够的信息以允许我用z替换任意值,然后向后求解y和x。然后我将矢量标准化以获得单位特征向量,这应该适用于我的目的。
我的最终代码:
Vect eigenVector(const Matrix &M, const float eVal) { Matrix A = Matrix(M); A -= Matrix(IDENTITY)*eVal; A.ref(); float K = 16; // Arbitrary value float J = -K*A[m6]; // Substitute in K to find J float I = -K*A[m2]-J*A[m1]; // Substitute in K and J to find I Vect eVec = Vect(I,J,K); eVec.norm(); // Normalize eigenvector return eVec; }
唯一奇怪的是,特征向量面向的方向与我预期相反(它们被否定了!),但这是一个没有实际意义的问题。