1

我目前正在编写一个函数来为 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() 的矩阵应该是什么样子才能得到一个特征向量?

谢谢

4

2 回答 2

1

(M - λI)V 不是一个方程,它只是一个表达式。然而,(M - λI)V = 0 是。它是将特征向量与特征值联系起来的方程。

因此,假设您的rref函数有效,我会想象您创建一个增广矩阵作为[(M - λI) | 0],其中0表示零向量。这听起来像是您已经在做的事情,所以我不得不假设您的rref功能已损坏。或者,它不知道如何处理 4x4 矩阵(与 4x3 矩阵相反,这是它对增广矩阵的期望)。

于 2010-10-14T15:06:22.267 回答
1

啊,经过几个小时的艰苦研究,我已经设法解决了我的问题。

问题是没有“一个”特征向量集,而是具有不同大小的无限数量。

我选择的方法是使用 REF(行梯形形式)而不是 RREF,在矩阵中留下足够的信息,让我可以用任意值替换 z,然后反向求解 y 和 x。然后我对向量进行归一化以获得一个单位特征向量,这应该适用于我的目的。

我的最终代码:

Vect eigenVector(const Matrix &M, const float eVal) {
   矩阵 A = 矩阵(M);
   A -= 矩阵(身份)* eVal;
   A.ref();
   浮动 K = 16; // 任意值
   浮动 J = -K*A[m6]; // 代入 K 以找到 J
   浮动 I = -K*A[m2]-J*A[m1];// 代入 K 和 J 以找到 I

   Vect eVec = Vect(I,J,K);
   eVec.norm(); // 归一化特征向量

   返回 eVec;
}

唯一奇怪的是,特征向量与我预期的方向相反(它们被否定了!),但这是一个没有实际意义的问题。

于 2010-10-14T15:10:01.167 回答