我有一组线性代数方程,Ax = By。其中A是36x20的矩阵,x是20x1的向量,B是36x13,y是13x1。等级(A)= 20。因为系统是超定的,所以最小二乘解是可能的,即; x =(A ^ TA)^-1A ^ TBy。我想要解决方案,以便应将残留误差e = Ax-By最小化。我使用Maple进行矩阵的转置和求逆,但是对如此大的矩阵求逆需要更长的时间和RAM。我什至花了一整天时间来求矩阵逆,但由于RAM内存不足,它被打断了。这非常慢,我想枫树是无法实现的。
任何人都可以建议使用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不是固定的
ones
和zeros
的矩阵。 B是一个矩阵,其中元素的sin
,cos
是实时传感器数据,而不是固定数据。在maple B中,几乎是变量和固定元素的矩阵,可以说是dense sparse
矩阵。同时,y是所有传感器或编码器的向量。 最佳答案
如果您的数据是浮点数,那么Maple应该会很快得到。如果A
,B
和y
都只有数字输入,请尝试,
ans := LinearAlgebra:-LeastSquares( evalf(A), evalf(B.y) );
或者,如果您想要本身具有最少2范数的解决方案,
ans := LinearAlgebra:-LeastSquares( evalf(A), evalf(B.y), 'optimize'=true );
我的猜测是您的数据纯粹是有理数或整数,并且您可能没有意识到使用此数据会使Maple尝试找到确切的有理答案。或者您可能在数据中有一些未知的符号数量(...尽管可能会使计算最小残留问题的目标成为现实)。这样的纯粹精确数据,无论是有理数据还是符号数据,都是潜在的内存吞噬梦night,并且可能根本就不是您在考虑使用C ++作为替代方案时真正想要的。这就是为什么我包装了对
evalf
的调用,以将数据转换为浮点数的原因。对于纯浮点数据,36x20最小二乘是一个小问题,而Maple应该能够在短短的一秒钟内完成。
您应该让
LinearAlgebra:-LeastSquares
例程进行提升,而不要自己尝试形成或使用正常方程式或进行Matrix求逆。如果您想要一种可靠的方法,请使用method=SVD
选项。让它处理数字难题。