c++ - 线性(超定)代数方程的解

标签 c++ matlab maple

我有一组线性代数方程,Ax=By。其中A是36x20的矩阵,x是20x1的 vector ,B是36x13,y是13x1。 排名(A)=20。因为系统是超定的,所以最小二乘解是可能的,即; x = (A^TA)^-1A^TBy。我想要的解决方案应使残留误差 e = Ax-By 最小化。我使用 Maple 对矩阵进行转置和求逆,但对如此大的矩阵进行求逆需要更长的时间和 RAM。我什至花了一整天时间进行矩阵求逆,但由于 RAM 内存不足,它被打断了。这非常慢,我想 Maple 无法实现。

有人可以建议用 C++ 或任何其他求解方程的方法来解决这个问题,而不是采用逆和转置。

矩阵的形成,

    [ 1 0 0 ...0]
    [ 0 1 0 ...0]
    [ 0 0 1 ...0]    [LinearVelocity_x]
    [ 0 0 0 ...1]    [LinearVelocity_y]
    [ . . . ....], x=[LinearVelocity_z] 
A = [ . . . ....]    [RotationalVelocity_ROLL]
    [ . . . ....]    [RotationalVelocity_PITCH]    
    [ 1 0 0 ...0]    [RotationalVelocity_YAW]
    [ 0 1 0 ...0]
    [ 0 0 1 ...0]
    [ 0 0 0 ...1]

x 基本上是位置 (x,y,z) 和方向(Roll、Pitch 和 Yaw) vector 。 但是 B 不是固定 oneszeros 的矩阵。 B 是一个矩阵,包含角度的sincos 元素,这些元素是实时传感器数据而不是固定数据。在 maple B 中,几乎是一个由变量和固定元素组成的矩阵,你可以说是一个dense sparse 矩阵。同时,y是所有传感器或编码器的 vector 。

最佳答案

如果您的数据是 float ,那么 Maple 应该可以很快得到它。如果 ABy 都只有数字条目,则尝试,

ans := LinearAlgebra:-LeastSquares( evalf(A), evalf(B.y) );

或者,如果您想要本身具有最小 2 范数的解决方案,

ans := LinearAlgebra:-LeastSquares( evalf(A), evalf(B.y), 'optimize'=true );

我的猜测是您的数据是纯有理数或整数,您可能没有意识到使用它会导致 Maple 尝试找到一个精确的有理数答案。或者您可能在数据中有一些未知的符号量(......尽管这可能会使计算最小残差的目标成为问题)。这种纯粹精确的数据,无论是理性的还是符号的,都是潜在的内存占用噩梦,并且可能根本不是您真正想要的,因为您正在考虑将 C++ 作为替代方案。这就是为什么我用 evalf 调用来将数据转换为 float 。

对于纯 float 据,36x20 最小二乘法是一个小问题,Maple 应该能够在几分之一秒内完成。

您应该让 LinearAlgebra:-LeastSquares 例程完成提升,而不是尝试自己形成或使用正规方程或矩阵求逆。如果您想要一种稳健的方法,请使用 method=SVD 选项。让它处理数值上的困难。

关于c++ - 线性(超定)代数方程的解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21540724/

相关文章:

c++ - boost 中是否有一个通用的 "clean-up"类?

matlab - 使用 9 个数据点进行数值微分

maple - 当 RAM 已满时停止执行(即避免写入磁盘)

maple - 如何在Maple中将数字转换为字符串?

logic - 如何验证具有&符号的逻辑函数的解决方案(在逻辑包中使用)

c++ - 唯一锁和条件变量 - 显式调用解锁

c++ - 在 C++ 中破坏 Vector 内容

c++ - 定义自己的异常类的最佳实践?

matlab - 如何在matlab中找到主峰(fft)

matlab - 从使 matlab 崩溃的函数中检索变量