【发布时间】:2018-11-25 17:22:22
【问题描述】:
我正在尝试使用 PCA 为我的网格找到最佳的 OOBB hitbox。为了做到这一点,我需要特征向量,但我有点迷失如何在不使用庞大库的情况下计算它们。
我实现了一种算法,该算法在给定 3x3 矩阵的情况下计算三个特征值。这个代码最初来自Wikipedia:
private Vector3 CalculateEigenvalues(ref Matrix3 A)
{
Vector3 val = new Vector3(0, 0, 0);
float p1 = A.M12 * A.M12 + A.M13 * A.M13 + A.M23 * A.M23;
if (p1 == 0)
{
val.X = A.M11;
val.Y = A.M22;
val.Z = A.M33;
}
else
{
float q = A.Trace / 3f;
float p2 = (float)(Math.Pow(A.M11 - q, 2) + Math.Pow(A.M22 - q, 2) + Math.Pow(A.M33 - q, 2)) + 2 * p1;
float p = (float)Math.Sqrt(p2 / 6);
Matrix4 I = Matrix4.Identity;
Matrix4.Mult(ref I, q, out Matrix4 tmp);
Matrix4 tmp2 = Matrix4.Subtract(new Matrix4(A), tmp);
Matrix4 B = Matrix4.Mult(tmp2, 1 / p);
float r = new Matrix3(B).Determinant / 2;
float phi = 0;
if (r <= -1)
phi = (float)Math.PI / 3;
else if (r >= 1)
phi = 0;
else
phi = (float)Math.Acos(r) / 3;
val.X = q + 2 * p * (float)Math.Cos(phi);
val.Z = q + 2 * p * (float)Math.Cos(phi + (2 * Math.PI / 3));
val.Y = 3 * q - val.X - val.Z;
}
return val;
}
但是,Wikipedia 文章没有用于计算三个特征值的特征向量的代码。我试图理解这个话题,但我的数学技能非常有限。我必须在每个教程中搜索每个单词。
所以我的问题是:
如果我有 3x3 矩阵和三个特征值,是否有任何简单的方法可以在不使用外部库的情况下计算相应的特征向量?
【问题讨论】:
-
您需要求解一个由三个线性方程组成的系统。这本身就是一项非常简单的任务,但需要一些编码。
-
好吧,我想我可以想出一个算法来解决一个三线性方程组。但是我怎么知道要放入哪些方程呢?
-
对于每个特征值 λ,对应的特征向量 v 是 Av = λv 的解。这扩展为 3 个方程——向量的每个分量一个。
标签: c# algorithm eigenvalue eigenvector