我有一组线性代数方程, 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不是固定ones
和zeros
的矩阵。 B是具有sin
,cos
角度的元素的矩阵,其是实时传感器数据而不是固定数据。在枫B中几乎是变量和固定元素的矩阵,你可以说dense sparse
矩阵。同时,y是所有传感器或编码器的矢量。
答案 0 :(得分:1)
如果您的数据是浮点数,那么Maple应该很快得到这个数据。如果A
,B
和y
都只有数字条目,请尝试,
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
选项。让它来处理数值上的困难。