Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "arm_math.h"
00026
00062 arm_status arm_mat_mult_f32(
00063 const arm_matrix_instance_f32 * pSrcA,
00064 const arm_matrix_instance_f32 * pSrcB,
00065 arm_matrix_instance_f32 * pDst)
00066 {
00067 float32_t *pIn1 = pSrcA->pData;
00068 float32_t *pIn2 = pSrcB->pData;
00069 float32_t *pInA = pSrcA->pData;
00070 float32_t *pOut = pDst->pData;
00071 float32_t *px;
00072 float32_t sum;
00073 float32_t in1, in2, in3, in4;
00074 uint16_t numRowsA = pSrcA->numRows;
00075 uint16_t numColsB = pSrcB->numCols;
00076 uint16_t numColsA = pSrcA->numCols;
00077 uint16_t col, i = 0u, j, row = numRowsA, colCnt;
00078 arm_status status;
00079
00080 #ifdef ARM_MATH_MATRIX_CHECK
00081
00082 if((pSrcA->numCols != pSrcB->numRows) ||
00083 (pSrcA->numRows != pDst->numRows) || (pSrcB->numCols != pDst->numCols))
00084 {
00085
00086
00087 status = ARM_MATH_SIZE_MISMATCH;
00088 }
00089 else
00090 #endif
00091 {
00092
00093
00094 do
00095 {
00096
00097 px = pOut + i;
00098
00099
00100 col = numColsB;
00101
00102
00103
00104 pIn2 = pSrcB->pData;
00105
00106 j = 0u;
00107
00108
00109 do
00110 {
00111
00112 sum = 0.0f;
00113
00114
00115 pIn1 = pInA;
00116
00117
00118 colCnt = numColsA >> 2u;
00119
00120
00121 while(colCnt > 0u)
00122 {
00123
00124 in3 = *pIn2;
00125 pIn2 += numColsB;
00126 in1 = pIn1[0];
00127 in2 = pIn1[1];
00128 sum += in1 * in3;
00129 in4 = *pIn2;
00130 pIn2 += numColsB;
00131 sum += in2 * in4;
00132
00133 in3 = *pIn2;
00134 pIn2 += numColsB;
00135 in1 = pIn1[2];
00136 in2 = pIn1[3];
00137 sum += in1 * in3;
00138 in4 = *pIn2;
00139 pIn2 += numColsB;
00140 sum += in2 * in4;
00141 pIn1 += 4u;
00142
00143
00144 colCnt--;
00145 }
00146
00147
00148
00149 colCnt = numColsA % 0x4u;
00150
00151 while(colCnt > 0u)
00152 {
00153
00154 sum += *pIn1++ * (*pIn2);
00155 pIn2 += numColsB;
00156
00157
00158 colCnt--;
00159 }
00160
00161
00162 *px++ = sum;
00163
00164
00165 j++;
00166 pIn2 = pSrcB->pData + j;
00167
00168
00169 col--;
00170
00171 } while(col > 0u);
00172
00173
00174 i = i + numColsB;
00175 pInA = pInA + numColsA;
00176
00177
00178 row--;
00179
00180 } while(row > 0u);
00181
00182
00183 status = ARM_MATH_SUCCESS;
00184 }
00185
00186
00187 return (status);
00188 }
00189