我有一组线性代数方程, Ax=By . 其中 A 是36x20的矩阵, x 是20x1的向量, B 是36x13, y 是13x1 . Rank(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是所有传感器或编码器的矢量 .
1 回答
如果您的数据是浮点数,那么Maple应该很快得到这个数据 . 如果
A
,B
和y
都只有数字条目,请尝试,或者,如果你想要一个本身具有最小2范数的解决方案,
我的猜测是你的数据是纯粹的理性或整数,你可能没有意识到使用它会导致Maple尝试找到一个确切的理性答案 . 或者你可能在数据中有一些未知的符号数量(......虽然这可以使计算最小残差问题的目标) . 这些纯粹精确的数据,无论是理性数据还是象征性数据,都是一种潜在的记忆,可能是一场噩梦,可能根本不是你真正想要的,而是将C视为一种替代方案 . 这就是为什么我包含调用
evalf
,将数据转换为浮点数的原因 .使用纯粹的浮点数据,36x20最小二乘是一个很小的问题,Maple应该能够在几分之一秒内完成 .
您应该让
LinearAlgebra:-LeastSquares
例程进行提升,而不是尝试形成或使用正规方程或自己进行Matrix反演 . 如果需要稳健的方法,请使用method=SVD
选项 . 让它来处理数值上的困难 .