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

时间:2014-02-04 00:29:54

标签: c++ matlab maple

我有一组线性代数方程, Ax = By 。其中 A 是36x20的矩阵, x 是20x1的向量, B 是36x13, y 是13x1。的秩(A)= 20 即可。因为系统是超定的,所以最小二乘解是可能的,i,e; 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)矢量。 但是,B不是固定oneszeros的矩阵。 B是具有sincos角度的元素的矩阵,其是实时传感器数据而不是固定数据。在枫B中几乎是变量和固定元素的矩阵,你可以说dense sparse矩阵。同时,y是所有传感器或编码器的矢量。

1 个答案:

答案 0 :(得分:1)

如果您的数据是浮点数,那么Maple应该很快得到这个数据。如果ABy都只有数字条目,请尝试,

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

或者,如果你想要的解决方案本身具有最小的2-norm,

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

我的猜测是你的数据是纯粹的理性或整数,你可能没有意识到使用它会导致Maple尝试找到一个确切的理性答案。或者你可能在数据中有一些未知的符号数量(......虽然这可以使计算最小残差问题的目标)。这些纯粹精确的数据,无论是理性的还是象征性的,都是一种潜在的记忆,可能会让人感到噩梦,而你可能根本不想要将C ++作为替代方案。这就是为什么我用evalf调用包装来将数据转换为浮点数。

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

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