微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 第19章 MatrixFunctions的使用(一)

第19章 MatrixFunctions的使用(一)

时间:10-02 整理:3721RD 点击:
第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光盘里面有此软件)查看打印信息现象如下:



                              

程序设计:

  1. /*
  2. *********************************************************************************************************
  3. *    函 数 名: DSP_MatInit
  4. *    功能说明: 矩阵数据初始化
  5. *    形    参:无
  6. *    返 回 值: 无
  7. *********************************************************************************************************
  8. */
  9. static void DSP_MatInit(void)
  10. {
  11.      uint8_t i;

  12.      /****浮点数数组******************************************************************/
  13.      float32_t pDataA[9] = {1.1f, 1.1f, 2.1f, 2.1f, 3.1f, 3.1f, 4.1f, 4.1f, 5.1f};
  14.    
  15.      arm_matrix_instance_f32 pSrcA; //3行3列数据
  16.      arm_matrix_instance_f32 pDst;
  17.    
  18.      /****定点数Q31数组******************************************************************/
  19.      q31_t pDataA1[9] = {1, 1, 2, 2, 3, 3, 4, 4, 5};
  20.    
  21.      arm_matrix_instance_q31 pSrcA1; //3行3列数据
  22.      arm_matrix_instance_q31 pDst1;
  23.    
  24.      /****定点数Q15数组******************************************************************/
  25.      q15_t pDataA2[9] = {1, 1, 2, 2, 3, 3, 4, 4, 5};
  26.    
  27.      arm_matrix_instance_q15 pSrcA2; //3行3列数据
  28.      arm_matrix_instance_q15 pDst2;
  29.    
  30.      /****浮点数***********************************************************************/
  31.      printf("****浮点数******************************************\r\n");
  32.      arm_mat_init_f32(&pSrcA, 3,3, pDataA);
  33.      for(i = 0; i < 9; i++)
  34.      {
  35.          printf("pDataA[%d] = %f\r\n", i, pDataA[i]);
  36.      }
  37.    
  38.      /****定点数Q31***********************************************************************/
  39.      printf("****浮点数******************************************\r\n");
  40.      arm_mat_init_q31(&pSrcA1, 3,3, pDataA1);
  41.      for(i = 0; i < 9; i++)
  42.      {
  43.          printf("pDataA1[%d] = %d\r\n", i, pDataA1[i]);
  44.      }
  45.    
  46.      /****定点数Q15***********************************************************************/
  47.      printf("****浮点数******************************************\r\n");
  48.      arm_mat_init_q15(&pSrcA2, 3,3, pDataA2);
  49.      for(i = 0; i < 9; i++)
  50.      {
  51.          printf("pDataA2[%d] = %d\r\n", i, pDataA2[i]);
  52.      }
  53.    
  54. }

复制代码


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光盘里面有此软件)查看打印信息现象如下:



程序设计:

  1. /*
  2. *********************************************************************************************************
  3. *    函 数 名: DSP_MatAdd
  4. *    功能说明: 矩阵求和
  5. *    形    参:无
  6. *    返 回 值: 无
  7. *********************************************************************************************************
  8. */
  9. static void DSP_MatAdd(void)
  10. {
  11.      uint8_t i;
  12.    
  13.      /****浮点数数组******************************************************************/
  14.      float32_t pDataA[9] = {1.1f, 1.1f, 2.1f, 2.1f, 3.1f, 3.1f, 4.1f, 4.1f, 5.1f};
  15.      float32_t pDataB[9] = {1.1f, 1.1f, 2.1f, 2.1f, 3.1f, 3.1f, 4.1f, 4.1f, 5.1f};
  16.      float32_t pDataDst[9];
  17.    
  18.      arm_matrix_instance_f32 pSrcA; //3行3列数据
  19.      arm_matrix_instance_f32 pSrcB; //3行3列数据
  20.      arm_matrix_instance_f32 pDst;
  21.    
  22.      /****定点数Q31数组******************************************************************/
  23.      q31_t pDataA1[9] = {1, 1, 2, 2, 3, 3, 4, 4, 5};
  24.      q31_t pDataB1[9] = {1, 1, 2, 2, 3, 3, 4, 4, 5};
  25.      q31_t pDataDst1[9];
  26.    
  27.      arm_matrix_instance_q31 pSrcA1; //3行3列数据
  28.      arm_matrix_instance_q31 pSrcB1; //3行3列数据
  29.      arm_matrix_instance_q31 pDst1;
  30.    
  31.      /****定点数Q15数组******************************************************************/
  32.      q15_t pDataA2[9] = {1, 1, 2, 2, 3, 3, 4, 4, 5};
  33.      q15_t pDataB2[9] = {1, 1, 2, 2, 3, 3, 4, 4, 5};
  34.      q15_t pDataDst2[9];
  35.    
  36.      arm_matrix_instance_q15 pSrcA2; //3行3列数据
  37.      arm_matrix_instance_q15 pSrcB2; //3行3列数据
  38.      arm_matrix_instance_q15 pDst2;
  39.    
  40.      /****浮点数***********************************************************************/
  41.      pSrcA.numCols = 3;
  42.      pSrcA.numRows = 3;
  43.      pSrcA.pData = pDataA;
  44.    
  45.      pSrcB.numCols = 3;
  46.      pSrcB.numRows = 3;
  47.      pSrcB.pData = pDataB;
  48.    
  49.      pDst.numCols = 3;
  50.      pDst.numRows = 3;
  51.      pDst.pData = pDataDst;
  52.    
  53.      printf("****浮点数******************************************\r\n");
  54.      arm_mat_add_f32(&pSrcA, &pSrcB, &pDst);
  55.      for(i = 0; i < 9; i++)
  56.      {
  57.          printf("pDataDst[%d] = %f\r\n", i, pDataDst[i]);
  58.      }
  59.    
  60.    
  61.      /****定点数Q31***********************************************************************/
  62.      pSrcA1.numCols = 3;
  63.      pSrcA1.numRows = 3;
  64.      pSrcA1.pData = pDataA1;
  65.    
  66.      pSrcB1.numCols = 3;
  67.      pSrcB1.numRows = 3;
  68.      pSrcB1.pData = pDataB1;
  69.    
  70.      pDst1.numCols = 3;
  71.      pDst1.numRows = 3;
  72.      pDst1.pData = pDataDst1;
  73.    
  74.      printf("****定点数Q31******************************************\r\n");
  75.      arm_mat_add_q31(&pSrcA1, &pSrcB1, &pDst1);
  76.      for(i = 0; i < 9; i++)
  77.      {
  78.          printf("pDataDst1[%d] = %d\r\n", i, pDataDst1[i]);
  79.      }
  80.    
  81.    
  82.      /****定点数Q15***********************************************************************/
  83.      pSrcA2.numCols = 3;
  84.      pSrcA2.numRows = 3;
  85.      pSrcA2.pData = pDataA2;
  86.    
  87.      pSrcB2.numCols = 3;
  88.      pSrcB2.numRows = 3;
  89.      pSrcB2.pData = pDataB2;
  90.    
  91.      pDst2.numCols = 3;
  92.      pDst2.numRows = 3;
  93.      pDst2.pData = pDataDst2;
  94.    
  95.      printf("****定点数Q15******************************************\r\n");
  96.      arm_mat_add_q15(&pSrcA2, &pSrcB2, &pDst2);
  97.      for(i = 0; i < 9; i++)
  98.      {
  99.          printf("pDataDst2[%d] = %d\r\n", i, pDataDst2[i]);
  100.      }
  101.    
  102. }

复制代码

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光盘里面有此软件)查看打印信息现象如下:




程序设计:

  1. /*
  2. *********************************************************************************************************
  3. *    函 数 名: DSP_MatSub
  4. *    功能说明: 矩阵减法
  5. *    形    参:无
  6. *    返 回 值: 无
  7. *********************************************************************************************************
  8. */
  9. static void DSP_MatSub(void)
  10. {
  11.      uint8_t i;
  12.    
  13.      /****浮点数数组******************************************************************/
  14.      float32_t pDataA[9] = {1.1f, 1.1f, 2.1f, 2.1f, 3.1f, 3.1f, 4.1f, 4.1f, 5.1f};
  15.      float32_t pDataB[9] = {1.1f, 1.1f, 2.1f, 2.1f, 3.1f, 3.1f, 4.1f, 4.1f, 5.1f};
  16.      float32_t pDataDst[9];
  17.    
  18.      arm_matrix_instance_f32 pSrcA; //3行3列数据
  19.      arm_matrix_instance_f32 pSrcB; //3行3列数据
  20.      arm_matrix_instance_f32 pDst;
  21.    
  22.      /****定点数Q31数组******************************************************************/
  23.      q31_t pDataA1[9] = {1, 1, 2, 2, 3, 3, 4, 4, 5};
  24.      q31_t pDataB1[9] = {2, 2, 2, 2, 2, 2, 2, 2, 2};
  25.      q31_t pDataDst1[9];
  26.    
  27.      arm_matrix_instance_q31 pSrcA1; //3行3列数据
  28.      arm_matrix_instance_q31 pSrcB1; //3行3列数据
  29.      arm_matrix_instance_q31 pDst1;
  30.    
  31.      /****定点数Q15数组******************************************************************/
  32.      q15_t pDataA2[9] = {1, 1, 2, 2, 3, 3, 4, 4, 5};
  33.      q15_t pDataB2[9] = {2, 2, 2, 2, 23, 2, 2, 2, 2};
  34.      q15_t pDataDst2[9];
  35.    
  36.      arm_matrix_instance_q15 pSrcA2; //3行3列数据
  37.      arm_matrix_instance_q15 pSrcB2; //3行3列数据
  38.      arm_matrix_instance_q15 pDst2;
  39.    
  40.      /****浮点数***********************************************************************/
  41.      pSrcA.numCols = 3;
  42.      pSrcA.numRows = 3;
  43.      pSrcA.pData = pDataA;
  44.    
  45.      pSrcB.numCols = 3;
  46.      pSrcB.numRows = 3;
  47.      pSrcB.pData = pDataB;
  48.    
  49.      pDst.numCols = 3;
  50.      pDst.numRows = 3;
  51.      pDst.pData = pDataDst;
  52.    
  53.      printf("****浮点数******************************************\r\n");
  54.      arm_mat_sub_f32(&pSrcA, &pSrcB, &pDst);
  55.      for(i = 0; i < 9; i++)
  56.      {
  57.          printf("pDataDst[%d] = %f\r\n", i, pDataDst[i]);
  58.      }
  59.    
  60.    
  61.      /****定点数Q31***********************************************************************/
  62.      pSrcA1.numCols = 3;
  63.      pSrcA1.numRows = 3;
  64.      pSrcA1.pData = pDataA1;
  65.    
  66.      pSrcB1.numCols = 3;
  67.      pSrcB1.numRows = 3;
  68.      pSrcB1.pData = pDataB1;
  69.    
  70.      pDst1.numCols = 3;
  71.      pDst1.numRows = 3;
  72.      pDst1.pData = pDataDst1;
  73.    
  74.      printf("****定点数Q31******************************************\r\n");
  75.      arm_mat_sub_q31(&pSrcA1, &pSrcB1, &pDst1);
  76.      for(i = 0; i < 9; i++)
  77.      {
  78.          printf("pDataDst1[%d] = %d\r\n", i, pDataDst1[i]);
  79.      }
  80.    
  81.    
  82.      /****定点数Q15***********************************************************************/
  83.      pSrcA2.numCols = 3;
  84.      pSrcA2.numRows = 3;
  85.      pSrcA2.pData = pDataA2;
  86.    
  87.      pSrcB2.numCols = 3;
  88.      pSrcB2.numRows = 3;
  89.      pSrcB2.pData = pDataB2;
  90.    
  91.      pDst2.numCols = 3;
  92.      pDst2.numRows = 3;
  93.      pDst2.pData = pDataDst2;
  94.    
  95.      printf("****定点数Q15******************************************\r\n");
  96.      arm_mat_sub_q15(&pSrcA2, &pSrcB2, &pDst2);
  97.      for(i = 0; i < 9; i++)
  98.      {
  99.          printf("pDataDst2[%d] = %d\r\n", i, pDataDst2[i]);
  100.      }
  101.    
  102. }

复制代码

1.    矩阵的减法从C语言的实现上来看,比较的容易,下面通过Matlab来求解矩阵和(在命令窗口输入)。




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

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top