This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

arm_mat_inverse_f32 producing incorrect singularities

Hi there,

I am trying to invert a matrix using arm_mat_inverse_f32(). I am getting correct results for some martices, but in the code below status3 = ARM_MATH_SINGULAR. status1 and 2 = ARM_MATH_SUCCESS.

Any ideas what is wrong here? Note that det(m3) = -921600, i.e. not singular.

I am using arm_math v1.5.3 on an Atmel SAM E70

arm_matrix_instance_f32 mat1, mat2, mat3;
arm_matrix_instance_f32 inv1, inv2, inv3;

#define SIZE1 (6)
#define SIZE2 (4)

float32_t m1[SIZE1*SIZE1] ={
    7.6294,  1.1843,  1.0842,  1.7056,  1.3111,  0.8036,
    1.1843,  7.0938,  1.4429,  1.9244,  0.9154,  1.0024,
    1.0842,  1.4429,  7.6006,  0.7976,  1.1649,  1.1927,
    1.7056,  1.9244,  0.7976,  6.0714,  1.2414,  0.9802,
    1.3111,  0.9154,  1.1649,  1.2414,  7.3110,  0.2683,
    0.8036,  1.0024,  1.1927,  0.9802,  0.2683,  7.6469  };

float32_t m2[SIZE1*SIZE1] = {
    2.4086, -1.7141,  0.9385, 1.9594, -0.4342, 1.3369,
    5.1228,  0.3019, -1.9435, 0.3259,  0.0788, 1.3030,
    -1.8536, -1.3981, 0.0812, -3.1542, 0.2977, 1.2532,
    -8.8154, 0.4773, -0.6195, 1.2333, -0.1475, 1.1768,
    1.6616, 1.9255, 0.8342, -1.4220, -0.6654, 1.0847,
    1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000};

float32_t m3[SIZE2*SIZE2] = {
    1.0,     32.0,      4.0,     128.0,
    1.0,     32.0,     64.0,    2048.0,
    1.0,     16.0,      4.0,      64.0,
    1.0,     16.0,     64.0,    1024.0};

float32_t m1int[SIZE1*SIZE1];
float32_t m3int[SIZE2*SIZE2];

arm_mat_init_f32(&mat1, SIZE1, SIZE1, (float32_t *) m1);
arm_mat_init_f32(&inv1, SIZE1, SIZE1, m1int);
arm_mat_init_f32(&mat2, SIZE1, SIZE1, (float32_t *) m2);
arm_mat_init_f32(&inv2, SIZE1, SIZE1, m1int);
arm_mat_init_f32(&mat3, SIZE2, SIZE2, (float32_t *) m3);
arm_mat_init_f32(&inv3, SIZE2, SIZE2, m3int);
//
status1 = arm_mat_inverse_f32(&mat1, &inv1);
status2 = arm_mat_inverse_f32(&mat2, &inv2);
status3 = arm_mat_inverse_f32(&mat3, &inv3);