ISSDK  1.8
IoT Sensing Software Development Kit
matrix.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2015, Freescale Semiconductor, Inc.
3  * Copyright 2016-2017 NXP
4  * All rights reserved.
5  *
6  * SPDX-License-Identifier: BSD-3-Clause
7  */
8 
9 /*! \file matrix.h
10  \brief Matrix manipulation functions
11 
12  Contains functions for basic manipulation of 3x3 matrices
13 */
14 
15 #ifndef MATRIX_H
16 #define MATRIX_H
17 
18 // function prototypes
19 
20 /// function sets the 3x3 matrix A to the identity matrix
21 void f3x3matrixAeqI(
22  float A[][3]
23 );
24 /// function sets 3x3 matrix A to 3x3 matrix B
25 void f3x3matrixAeqB(
26  float A[][3],
27  float B[][3]
28 );
29 /// function sets the matrix A to the identity matrix
30 void fmatrixAeqI(
31  float *A[], ///< pointer to the matrix
32  int16 rc ///< dimension of the matrix
33 );
34 /// function sets every entry in the 3x3 matrix A to a constant scalar
36  float A[][3],
37  float Scalar
38 );
39 /// function directly calculates the symmetric inverse of a symmetric 3x3 matrix
40 /// only the on and above diagonal terms in B are used and need to be specified
42  float A[][3],
43  float B[][3]
44 );
45 /// function multiplies all elements of 3x3 matrix A by the specified scalar
47  float A[][3],
48  float Scalar
49 );
50 /// function negates all elements of 3x3 matrix A
52  float A[][3]
53 );
54 /// function calculates the determinant of a 3x3 matrix
55 float f3x3matrixDetA(
56  float A[][3]
57 );
58 /// function computes all eigenvalues and eigenvectors of a real symmetric matrix A[0..n-1][0..n-1]
59 /// stored in the top left of a 10x10 array A[10][10]
60 void fEigenCompute10(
61  float A[][10], ///< real symmetric matrix A[0..n-1][0..n-1]
62  float eigval[], ///< eigval[0..n-1] returns the eigenvalues of A[][].
63  float eigvec[][10], ///< eigvec[0..n-1][0..n-1] returns the normalized eigenvectors of A[][]
64  int8 n ///< n can vary up to and including 10 but the matrices A and eigvec must have 10 columns.
65 );
66 /// function computes all eigenvalues and eigenvectors of a real symmetric matrix A[0..n-1][0..n-1]
67 /// stored in the top left of a 4x4 array A[4][4]
68 /// A[][] is changed on output.
69 /// The eigenvectors are not sorted by value.
70 /// This function is identical to eigencompute10 except for the workaround for 4x4 matrices since C cannot
71 /// handle functions accepting matrices with variable numbers of columns.
72 void fEigenCompute4(
73  float A[][4],
74  float eigval[], ///< eigval[0..n-1] returns the eigenvalues of A[][].
75  float eigvec[][4], ///< eigvec[0..n-1][0..n-1] returns the normalized eigenvectors of A[][]
76  int8 n ///< n can vary up to and including 4 but the matrices A and eigvec must have 4 columns.
77 );
78 void fComputeEigSlice(
79  float fmatA[10][10],
80  float fmatB[10][10],
81  float fvecA[10],
82  int8 i,
83  int8 j,
84  int8 iMatrixSize
85 );
86 /// function uses Gauss-Jordan elimination to compute the inverse of matrix A in situ
87 /// on exit, A is replaced with its inverse
88 void fmatrixAeqInvA(
89  float *A[],
90  int8 iColInd[],
91  int8 iRowInd[],
92  int8 iPivot[],
93  int8 isize,
94  int8* pierror
95 );
96 /// function rotates 3x1 vector u onto 3x1 vector using 3x3 rotation matrix fR.
97 /// the rotation is applied in the inverse direction if itranpose is true
98 void fveqRu(
99  float fv[], ///< 3x1 output vector
100  float fR[][3], ///< rotation matrix
101  float fu[], ///< 3x1 input vector
102  int8 itranspose ///< true if inverse direction desired
103 );
104 /// function multiplies the 3x1 vector V by a 3x3 matrix A
105 void fVeq3x3AxV(
106  float V[3], ///< used for both input and output
107  float A[][3]
108 );
109 
110 #endif // #ifndef MATRIX_H
void fmatrixAeqInvA(float *A[], int8 iColInd[], int8 iRowInd[], int8 iPivot[], int8 isize, int8 *pierror)
Definition: matrix.c:648
void fComputeEigSlice(float fmatA[10][10], float fmatB[10][10], float fvecA[10], int8 i, int8 j, int8 iMatrixSize)
Definition: matrix.c:554
void f3x3matrixAeqMinusA(float A[][3])
function negates all elements of 3x3 matrix A
Definition: matrix.c:129
#define B
Definition: status.c:30
int8_t int8
Definition: sensor_fusion.h:39
void f3x3matrixAeqI(float A[][3])
function sets the 3x3 matrix A to the identity matrix
Definition: matrix.c:27
void f3x3matrixAeqB(float A[][3], float B[][3])
function sets 3x3 matrix A to 3x3 matrix B
Definition: matrix.c:48
int16_t int16
Definition: sensor_fusion.h:40
float f3x3matrixDetA(float A[][3])
function calculates the determinant of a 3x3 matrix
Definition: matrix.c:191
void fVeq3x3AxV(float V[3], float A[][3])
function multiplies the 3x1 vector V by a 3x3 matrix A
Definition: matrix.c:853
void f3x3matrixAeqInvSymB(float A[][3], float B[][3])
Definition: matrix.c:150
void fveqRu(float fv[], float fR[][3], float fu[], int8 itranspose)
Definition: matrix.c:802
void fmatrixAeqI(float *A[], int16 rc)
function sets the matrix A to the identity matrix
Definition: matrix.c:69
void fEigenCompute10(float A[][10], float eigval[], float eigvec[][10], int8 n)
Definition: matrix.c:216
void fEigenCompute4(float A[][4], float eigval[], float eigvec[][4], int8 n)
Definition: matrix.c:389
void f3x3matrixAeqScalar(float A[][3], float Scalar)
function sets every entry in the 3x3 matrix A to a constant scalar
Definition: matrix.c:91
void f3x3matrixAeqAxScalar(float A[][3], float Scalar)
function multiplies all elements of 3x3 matrix A by the specified scalar
Definition: matrix.c:110