55 lines
1.3 KiB
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;
|
|
}
|