gpt4 book ai didi

c++ - 查找协方差矩阵的特征向量以创建 3D 包围球

转载 作者:行者123 更新时间:2023-11-30 04:37:18 26 4
gpt4 key购买 nike

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

谢谢

最佳答案

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

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

关于c++ - 查找协方差矩阵的特征向量以创建 3D 包围球,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3932919/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com