矩阵是数学中常用的一个工具,是线性代数中比较重要的一节。ARM官方的CMSIS-DSP库中就提供矩阵中常用的一些计算,包括矩阵的加减法、矩阵的乘法、矩阵的数乘、矩阵的转置和取逆。
本文基于DSP库函数,就上述的计算进行测试,因取逆要求矩阵为方阵,采用5阶方阵。
矩阵A=
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
矩阵B=
3 3 3 3 3
3 3 3 3 3
3 3 3 3 3
3 3 3 3 3
3 3 3 3 3
测试函数:
#include "dsp_test.h"
arm_matrix_instance_f32 S;
arm_matrix_instance_f32 S1;
arm_matrix_instance_f32 S2;
uint16_t nRows=5;
uint16_t nColumns=5;
static void dsp_test1(void)
{
float32_t pData[25]={17,24,1,8,15,
23,5,7,14,16,
4,6,13,20,22,
10,12,19,21,3,
11,18,25,2,9};
float32_t pData1[25]={3,3,3,3,3,
3,3,3,3,3,
3,3,3,3,3,
3,3,3,3,3,
3,3,3,3,3};
float32_t pData2[25]={0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0};
u8 i=0;
arm_mat_init_f32(&S,nRows,nColumns,pData);
arm_mat_init_f32(&S1,nRows,nColumns,pData1);
arm_mat_init_f32(&S2,nRows,nColumns,pData2);
printf("矩阵A=\r\n");
for(i=0;i<25;i++)
{
printf("%f ",S.pData[i]);
if(i%5==4)
{
printf("\r\n");
}
}
printf("\r\n");
printf("矩阵B=\r\n");
for(i=0;i<25;i++)
{
printf("%f ",S1.pData[i]);
if(i%5==4)
{
printf("\r\n");
}
}
arm_mat_add_f32(&S,&S1,&S2);
printf("\r\n");
printf("矩阵A+B=\r\n");
for(i=0;i<25;i++)
{
printf("%f ",S2.pData[i]);
if(i%5==4)
{
printf("\r\n");
}
}
arm_mat_mult_f32(&S,&S1,&S2);
printf("\r\n");
printf("矩阵A*B=\r\n");
for(i=0;i<25;i++)
{
printf("%f ",S2.pData[i]);
if(i%5==4)
{
printf("\r\n");
}
}
arm_mat_inverse_f32(&S,&S2);
printf("\r\n");
printf("矩阵A的逆矩阵=\r\n");
for(i=0;i<25;i++)
{
printf("%f ",S2.pData[i]);
if(i%5==4)
{
printf("\r\n");
}
}
}
static void dsp_test2(void)
{
u8 i=0;
float32_t pData[25]={17,24,1,8,15,
23,5,7,14,16,
4,6,13,20,22,
10,12,19,21,3,
11,18,25,2,9};
float32_t pData1[25]={3,3,3,3,3,
3,3,3,3,3,
3,3,3,3,3,
3,3,3,3,3,
3,3,3,3,3};
float32_t pData2[25]={0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0};
arm_mat_init_f32(&S,nRows,nColumns,pData);
arm_mat_init_f32(&S1,nRows,nColumns,pData1);
arm_mat_init_f32(&S2,nRows,nColumns,pData2);
arm_mat_scale_f32(&S,0.1f,&S2);
printf("\r\n");
printf("矩阵A*0.1=\r\n");
for(i=0;i<25;i++)
{
printf("%f ",S2.pData[i]);
if(i%5==4)
{
printf("\r\n");
}
}
arm_mat_sub_f32(&S,&S1,&S2);
printf("\r\n");
printf("矩阵A-B=\r\n");
for(i=0;i<25;i++)
{
printf("%f ",S2.pData[i]);
if(i%5==4)
{
printf("\r\n");
}
}
arm_mat_trans_f32(&S,&S2);
printf("\r\n");
printf("矩阵A的转置=\r\n");
for(i=0;i<25;i++)
{
printf("%f ",S2.pData[i]);
if(i%5==4)
{
printf("\r\n");
}
}
}
void dsp_test(void)
{
dsp_test1();
dsp_test2();
}
测试结果:
测试结论与MATLAB结果一致