最近在做一个项目,需要用到矩阵运算,在用STM32F407 DSPLib矩阵求逆的过程中发现一个问题,就是利用STM32F4 的浮点库计算逆矩阵的时候,有些逆矩阵无法求解,求不出啦,但是我用Matlab其他仿真工具求解的时候,矩阵都是可逆的,而且都能正常求解。
是不是在使用407的浮点库中使用不当,有没有注意到的地方,非常感谢!
float32_t A_f32[9] = {
0, 0, -20000,
200, -200, 0,
0, -400, 0
};
float32_t B_f32[9] = {
0, 200, 0,
0, -200, -400,
-20000, -0, 0
};
float32_t C_f32[9] = {
-200, 0, -20000,
200, -200, -2,
0, -400, 0
};
float32_t AI_f32[9] ={0};
arm_status status;
void Mat_Inverse( float32_t *pA_f32,float32_t * pAI_f32 )
{
arm_matrix_instance_f32 A; /* Matrix A Instance */
arm_matrix_instance_f32 AI; /* Matrix AT(A transpose) instance */
arm_mat_init_f32(&A, 3, 3, pA_f32);
arm_mat_init_f32(&AI, 3, 3, pAI_f32);
status = arm_mat_inverse_f32(&A, &AI);
delay_ms(100);
}
这个是一个求逆矩阵的函数,我们发现A_f32,B_f32都无法求解,而C_f32是可以求解的。实际上,在matlab中,三个举证都是可以求解的,如下图:
>> A = [0 0 -20000;200 -200 0; 0 -400 0]
A =
0 0 -20000
200 -200 0
0 -400 0
>> B = inv(A)
B =
0 0.0050 -0.0025
0 0 -0.0025
-0.0001 0 0
>> A = [0 200 0;0 -200 -400; -20000 0 0]
A =
0 200 0
0 -200 -400
-20000 0 0
>> B = inv(A)
B =
0 0 -0.0001
0.0050 0 0
-0.0025 -0.0025 0
>> A = [-200 0 -20000;200 -200 -2; 0 -400 0]
A =
-200 0 -20000
200 -200 -2
0 -400 0
>> B = inv(A)
B =
-0.0000 0.0050 -0.0025
0 0 -0.0025
-0.0000 -0.0000 0.0000
>>
我们在用407求解的时候,函数调用如下,只有C_f32可以被正确求解:
Mat_Inverse(A_f32, AI_f32);
Mat_Inverse(C_f32, AI_f32);
Mat_Inverse(B_f32, AI_f32);
非常感谢!
|