This repository has been archived on 2023-07-17. You can view files and clone it, but cannot push or open issues or pull requests.
bl_mcu_sdk/examples/dsp/MatrixFunctions_q31Part/mat_inverse.c

55 lines
1.3 KiB
C

#include "ref.h"
riscv_status ref_mat_inverse_f32(const riscv_matrix_instance_f32 *pSrc,
riscv_matrix_instance_f32 *pDst)
{
float32_t det;
uint32_t i, size;
riscv_matrix_instance_f32 tmp;
tmp.numCols = pSrc->numCols;
tmp.numRows = pSrc->numRows;
tmp.pData = scratchArray;
det = ref_detrm(pSrc->pData, scratchArray, pSrc->numCols);
size = pSrc->numCols * pSrc->numCols;
ref_cofact(pSrc->pData, scratchArray, scratchArray + size, pSrc->numCols);
ref_mat_trans_f32(&tmp, pDst);
for (i = 0; i < size; i++) {
pDst->pData[i] /= det;
}
return RISCV_MATH_SUCCESS;
}
riscv_status ref_mat_inverse_f64(const riscv_matrix_instance_f64 *pSrc,
riscv_matrix_instance_f64 *pDst)
{
float64_t det;
uint32_t i, size;
riscv_matrix_instance_f64 tmp;
tmp.numCols = pSrc->numCols;
tmp.numRows = pSrc->numRows;
tmp.pData = (float64_t *)scratchArray;
det = ref_detrm64(pSrc->pData, (float64_t *)scratchArray, pSrc->numCols);
size = pSrc->numCols * pSrc->numCols;
ref_cofact64(pSrc->pData, (float64_t *)scratchArray,
(float64_t *)scratchArray + size, pSrc->numCols);
ref_mat_trans_f64(&tmp, pDst);
for (i = 0; i < size; i++) {
pDst->pData[i] /= det;
}
return RISCV_MATH_SUCCESS;
}