第19章 MatrixFunctions的使用(一)
本期教程主要讲解矩阵运算中的初始化,加法,逆矩阵和减法。
19.1 矩阵初始化MatInit
19.2 矩阵加法MatAdd
19.3 逆矩阵MatInverse
19.4 矩阵减法MatSub
19.5 总结
19.1 矩阵初始化MatInit
19.1.1 arm_mat_init_f32
函数定义如下:
void arm_mat_init_f32(
arm_matrix_instance_f32 * S,
uint16_t nRows,
uint16_t nColumns,
float32_t * pData)
参数定义:
[in,out] *S pointsto an instance of the floating-point matrix structure.
[in] nRows number of rows in the matrix.
[in] nColumns number of columns in thematrix.
[in] *pData points to the matrix data array.
注意事项:
1. arm_matrix_instance_f32的结构体定义如下(在文件arm_math.h文件里面):
typedefstruct
{
uint16_t numRows; // number of rows of the matrix.
uint16_t numCols; //number of columns of the matrix.
float32_t *pData; // points to the data of the matrix.
} arm_matrix_instance_f32;
19.1.2 arm_mat_init_q31
函数定义如下:
void arm_mat_init_q31(
arm_matrix_instance_q31 * S,
uint16_t nRows,
uint16_t nColumns,
q31_t * pData)
参数定义:
[in,out] *S pointsto an instance of the floating-point matrix structure.
[in] nRows number of rows in the matrix.
[in] nColumns number of columns in thematrix.
[in] *pData points to the matrix data array.
注意事项:
1. arm_matrix_instance_q31的结构体定义如下(在文件arm_math.h文件里面):
typedefstruct
{
uint16_t numRows; // number of rows of the matrix.
uint16_t numCols; //number of columns of the matrix.
q31_t *pData; //points to the data of the matrix.
} arm_matrix_instance_q31;
19.1.3 arm_mat_init_q15
函数定义如下:
void arm_mat_init_q15(
arm_matrix_instance_q15 * S,
uint16_t nRows,
uint16_t nColumns,
q15_t * pData)
参数定义:
[in,out] *S pointsto an instance of the floating-point matrix structure.
[in] nRows number of rows in the matrix.
[in] nColumns number of columns in thematrix.
[in] *pData points to the matrix data array.
注意事项:
1. arm_matrix_instance_q15的结构体定义如下(在文件arm_math.h文件里面):
typedefstruct
{
uint16_t numRows; // number of rows of the matrix.
uint16_t numCols; //number of columns of the matrix.
q15_t *pData; //points to the data of the matrix.
} arm_matrix_instance_q15;
19.1.4 实例讲解
实验目的:
1. 学习MatrixFunctions中矩阵的初始化
实验内容:
1. 按下按键K1, 串口打印函数DSP_MatInit的输出结果
实验现象:
通过窗口上位机软件SecureCRT(V5光盘里面有此软件)查看打印信息现象如下:

程序设计:
19.2 矩阵加法 MatAdd
19.2.1 arm_mat_add_f32
公式描述(以3*3矩阵为例进行说明):

函数定义如下:
arm_statusarm_mat_add_f32(
const arm_matrix_instance_f32 * pSrcA,
const arm_matrix_instance_f32 * pSrcB,
arm_matrix_instance_f32 * pDst)
参数定义:
[in] *pSrcA points to the first input matrixstructure
[in] *pSrcB points to the second input matrixstructure
[out] *pDst points to output matrix structure
return Thefunction returns either
注意事项:
1. pSrcA,pSrcB,pDst的行数和列数必须是相同的,要不没有办法使用加法运行。
2. 矩阵在数组中的存储是从左到右,再从上到下。
19.2.2 arm_mat_add_q31
函数定义如下:
arm_statusarm_mat_add_q31(
const arm_matrix_instance_q31 * pSrcA,
const arm_matrix_instance_q31 * pSrcB,
arm_matrix_instance_q31 * pDst)
参数定义:
[in] *pSrcA points to the first input matrixstructure
[in] *pSrcB points to the second input matrixstructure
[out] *pDst points to output matrix structure
return Thefunction returns either
注意事项:
1. pSrcA,pSrcB,pDst的行数和列数必须是相同的,要不没有办法使用加法运行。
2. 矩阵在数组中的存储是从左到右,再从上到下。
19.2.3 arm_mat_add_q15
函数定义如下:
arm_statusarm_mat_add_q15(
const arm_matrix_instance_q15 * pSrcA,
const arm_matrix_instance_q15 * pSrcB,
arm_matrix_instance_q15 * pDst)
参数定义:
[in] *pSrcA points to the first input matrixstructure
[in] *pSrcB points to the second input matrixstructure
[out] *pDst points to output matrix structure
return Thefunction returns either
注意事项:
1. pSrcA,pSrcB,pDst的行数和列数必须是相同的,要不没有办法使用加法运行。
2. 矩阵在数组中的存储是从左到右,再从上到下。
19.2.4 实例讲解
实验目的:
1. 学习MatrixFunctions中矩阵的加法
实验内容:
1. 按下按键K2, 串口打印函数DSP_MatAdd的输出结果
实验现象:
通过窗口上位机软件SecureCRT(V5光盘里面有此软件)查看打印信息现象如下:

程序设计:
- /*
- *********************************************************************************************************
- * 函 数 名: DSP_MatAdd
- * 功能说明: 矩阵求和
- * 形 参:无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- static void DSP_MatAdd(void)
- {
- uint8_t i;
-
- /****浮点数数组******************************************************************/
- float32_t pDataA[9] = {1.1f, 1.1f, 2.1f, 2.1f, 3.1f, 3.1f, 4.1f, 4.1f, 5.1f};
- float32_t pDataB[9] = {1.1f, 1.1f, 2.1f, 2.1f, 3.1f, 3.1f, 4.1f, 4.1f, 5.1f};
- float32_t pDataDst[9];
-
- arm_matrix_instance_f32 pSrcA; //3行3列数据
- arm_matrix_instance_f32 pSrcB; //3行3列数据
- arm_matrix_instance_f32 pDst;
-
- /****定点数Q31数组******************************************************************/
- q31_t pDataA1[9] = {1, 1, 2, 2, 3, 3, 4, 4, 5};
- q31_t pDataB1[9] = {1, 1, 2, 2, 3, 3, 4, 4, 5};
- q31_t pDataDst1[9];
-
- arm_matrix_instance_q31 pSrcA1; //3行3列数据
- arm_matrix_instance_q31 pSrcB1; //3行3列数据
- arm_matrix_instance_q31 pDst1;
-
- /****定点数Q15数组******************************************************************/
- q15_t pDataA2[9] = {1, 1, 2, 2, 3, 3, 4, 4, 5};
- q15_t pDataB2[9] = {1, 1, 2, 2, 3, 3, 4, 4, 5};
- q15_t pDataDst2[9];
-
- arm_matrix_instance_q15 pSrcA2; //3行3列数据
- arm_matrix_instance_q15 pSrcB2; //3行3列数据
- arm_matrix_instance_q15 pDst2;
-
- /****浮点数***********************************************************************/
- pSrcA.numCols = 3;
- pSrcA.numRows = 3;
- pSrcA.pData = pDataA;
-
- pSrcB.numCols = 3;
- pSrcB.numRows = 3;
- pSrcB.pData = pDataB;
-
- pDst.numCols = 3;
- pDst.numRows = 3;
- pDst.pData = pDataDst;
-
- printf("****浮点数******************************************\r\n");
- arm_mat_add_f32(&pSrcA, &pSrcB, &pDst);
- for(i = 0; i < 9; i++)
- {
- printf("pDataDst[%d] = %f\r\n", i, pDataDst[i]);
- }
-
-
- /****定点数Q31***********************************************************************/
- pSrcA1.numCols = 3;
- pSrcA1.numRows = 3;
- pSrcA1.pData = pDataA1;
-
- pSrcB1.numCols = 3;
- pSrcB1.numRows = 3;
- pSrcB1.pData = pDataB1;
-
- pDst1.numCols = 3;
- pDst1.numRows = 3;
- pDst1.pData = pDataDst1;
-
- printf("****定点数Q31******************************************\r\n");
- arm_mat_add_q31(&pSrcA1, &pSrcB1, &pDst1);
- for(i = 0; i < 9; i++)
- {
- printf("pDataDst1[%d] = %d\r\n", i, pDataDst1[i]);
- }
-
-
- /****定点数Q15***********************************************************************/
- pSrcA2.numCols = 3;
- pSrcA2.numRows = 3;
- pSrcA2.pData = pDataA2;
-
- pSrcB2.numCols = 3;
- pSrcB2.numRows = 3;
- pSrcB2.pData = pDataB2;
-
- pDst2.numCols = 3;
- pDst2.numRows = 3;
- pDst2.pData = pDataDst2;
-
- printf("****定点数Q15******************************************\r\n");
- arm_mat_add_q15(&pSrcA2, &pSrcB2, &pDst2);
- for(i = 0; i < 9; i++)
- {
- printf("pDataDst2[%d] = %d\r\n", i, pDataDst2[i]);
- }
-
- }
1. 矩阵的加法从C语言的实现上来看,比较的容易,下面通过Matlab来求解矩阵和(在命令窗口输入)。

19.4 矩阵减法 MatSub
19.4.1 arm_mat_sub_f32
公式描述(以3*3矩阵为例进行说明):

函数定义如下:
arm_status arm_mat_sub_f32(
const arm_matrix_instance_f32 * pSrcA,
const arm_matrix_instance_f32 * pSrcB,
arm_matrix_instance_f32 * pDst)
参数定义:
[in] *pSrcA points to the first input matrixstructure
[in] *pSrcB points to the second input matrixstructure
[out] *pDst points to output matrix structure
return Thefunction returns either
注意事项:
1. pSrcA,pSrcB,pDst的行数和列数必须是相同的,要不没有办法使用加法运行。
2. 矩阵在数组中的存储是从左到右,再从上到下。
19.4.2 arm_mat_add_q31函数定义如下:
arm_statusarm_mat_add_q31(
const arm_matrix_instance_q31 * pSrcA,
const arm_matrix_instance_q31 * pSrcB,
arm_matrix_instance_q31 * pDst)
参数定义:
[in] *pSrcA points to the first input matrixstructure
[in] *pSrcB points to the second input matrixstructure
[out] *pDst points to output matrix structure
return Thefunction returns either
注意事项:
1. pSrcA,pSrcB,pDst的行数和列数必须是相同的,要不没有办法使用加法运行。
2. 矩阵在数组中的存储是从左到右,再从上到下。
19.4.3 arm_mat_add_q15函数定义如下:
arm_statusarm_mat_add_q15(
const arm_matrix_instance_q15 * pSrcA,
const arm_matrix_instance_q15 * pSrcB,
arm_matrix_instance_q15 * pDst)
参数定义:
[in] *pSrcA points to the first input matrixstructure
[in] *pSrcB points to the second input matrixstructure
[out] *pDst points to output matrix structure
return Thefunction returns either
注意事项:
1. pSrcA,pSrcB,pDst的行数和列数必须是相同的,要不没有办法使用加法运行。
2. 矩阵在数组中的存储是从左到右,再从上到下。
19.4.4 实例讲解实验目的:
1. 学习MatrixFunctions中矩阵的加法
实验内容:
1. 按下按键K2, 串口打印函数DSP_MatAdd的输出结果
实验现象:
通过窗口上位机软件SecureCRT(V5光盘里面有此软件)查看打印信息现象如下:

程序设计:
- /*
- *********************************************************************************************************
- * 函 数 名: DSP_MatSub
- * 功能说明: 矩阵减法
- * 形 参:无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- static void DSP_MatSub(void)
- {
- uint8_t i;
-
- /****浮点数数组******************************************************************/
- float32_t pDataA[9] = {1.1f, 1.1f, 2.1f, 2.1f, 3.1f, 3.1f, 4.1f, 4.1f, 5.1f};
- float32_t pDataB[9] = {1.1f, 1.1f, 2.1f, 2.1f, 3.1f, 3.1f, 4.1f, 4.1f, 5.1f};
- float32_t pDataDst[9];
-
- arm_matrix_instance_f32 pSrcA; //3行3列数据
- arm_matrix_instance_f32 pSrcB; //3行3列数据
- arm_matrix_instance_f32 pDst;
-
- /****定点数Q31数组******************************************************************/
- q31_t pDataA1[9] = {1, 1, 2, 2, 3, 3, 4, 4, 5};
- q31_t pDataB1[9] = {2, 2, 2, 2, 2, 2, 2, 2, 2};
- q31_t pDataDst1[9];
-
- arm_matrix_instance_q31 pSrcA1; //3行3列数据
- arm_matrix_instance_q31 pSrcB1; //3行3列数据
- arm_matrix_instance_q31 pDst1;
-
- /****定点数Q15数组******************************************************************/
- q15_t pDataA2[9] = {1, 1, 2, 2, 3, 3, 4, 4, 5};
- q15_t pDataB2[9] = {2, 2, 2, 2, 23, 2, 2, 2, 2};
- q15_t pDataDst2[9];
-
- arm_matrix_instance_q15 pSrcA2; //3行3列数据
- arm_matrix_instance_q15 pSrcB2; //3行3列数据
- arm_matrix_instance_q15 pDst2;
-
- /****浮点数***********************************************************************/
- pSrcA.numCols = 3;
- pSrcA.numRows = 3;
- pSrcA.pData = pDataA;
-
- pSrcB.numCols = 3;
- pSrcB.numRows = 3;
- pSrcB.pData = pDataB;
-
- pDst.numCols = 3;
- pDst.numRows = 3;
- pDst.pData = pDataDst;
-
- printf("****浮点数******************************************\r\n");
- arm_mat_sub_f32(&pSrcA, &pSrcB, &pDst);
- for(i = 0; i < 9; i++)
- {
- printf("pDataDst[%d] = %f\r\n", i, pDataDst[i]);
- }
-
-
- /****定点数Q31***********************************************************************/
- pSrcA1.numCols = 3;
- pSrcA1.numRows = 3;
- pSrcA1.pData = pDataA1;
-
- pSrcB1.numCols = 3;
- pSrcB1.numRows = 3;
- pSrcB1.pData = pDataB1;
-
- pDst1.numCols = 3;
- pDst1.numRows = 3;
- pDst1.pData = pDataDst1;
-
- printf("****定点数Q31******************************************\r\n");
- arm_mat_sub_q31(&pSrcA1, &pSrcB1, &pDst1);
- for(i = 0; i < 9; i++)
- {
- printf("pDataDst1[%d] = %d\r\n", i, pDataDst1[i]);
- }
-
-
- /****定点数Q15***********************************************************************/
- pSrcA2.numCols = 3;
- pSrcA2.numRows = 3;
- pSrcA2.pData = pDataA2;
-
- pSrcB2.numCols = 3;
- pSrcB2.numRows = 3;
- pSrcB2.pData = pDataB2;
-
- pDst2.numCols = 3;
- pDst2.numRows = 3;
- pDst2.pData = pDataDst2;
-
- printf("****定点数Q15******************************************\r\n");
- arm_mat_sub_q15(&pSrcA2, &pSrcB2, &pDst2);
- for(i = 0; i < 9; i++)
- {
- printf("pDataDst2[%d] = %d\r\n", i, pDataDst2[i]);
- }
-
- }
1. 矩阵的减法从C语言的实现上来看,比较的容易,下面通过Matlab来求解矩阵和(在命令窗口输入)。

19.5 总结
本期教程就跟大家讲这么多,有兴趣的可以深入研究下算法的具体实现。
