由于需要DSP内进行矩阵运算,完善补充了网上现存的矩阵运算,形成了矩阵运算库。包括方阵/非方阵矩阵的加减乘除、数乘、转置、求逆、求余子式、求行列式等,比网上现存的全面一些。使用方法已在代码中标出。
void matrixisation(double(*s)[4], int m, int n);//数组矩阵化(m*n),只支持一行的数据
void MATRIX_add(double(*s)[4], double(*t)[4], double(*p)[4], int m, int n, double b);//前两个相加,最后1为+,0为-
void MATRIX_multi(double(*s)[4], double(*t)[4], double(*p)[4], int m, int n, double x, double y);//前两个乘
void MATRIX_trans(double(*s)[4], double(*t)[4], int m, int n);//第一个转置
void MATRIX_shucheng(double(*s)[4], double(*t)[4], int m, int n, double k);//K乘第一个矩阵s(m*n),得数为第二个矩阵t
void MATRIX_getCOS(int m, int n, double(*s)[4], double(*t)[4], int mn);//得到m*n的余子式t
double MATRIX_value(double(*s)[4], int MatrixSize);//行列式
void MATRIX_inverse(double(*s)[4], double(*t)[4], int MatrixSize);//逆矩阵
void c2dmatrixZOH(double dt, double(*A)[4], double(*Ad)[4]);
void matrixisation(double(*s)[4], int m, int n) {//数组矩阵化,kl:考虑到当输入的线性数组s很长,占用到第二行时的情况。比如定义[4][4]但是有20+个数据输入
int tempmatrix[4][4];
int k = 0, l = 0;
int i, j;
for (i = 0; i < m; i++) {
for (j = 0; j < n; j++) {
tempmatrix[i][j] = s[k][l++];
if (l == 4) { k++; l = 0; }
}
}
for (i = 0; i < m; i++)
for (j = 0; j < n; j++)
s[i][j] = tempmatrix[i][j];
for (i = n; i < 4; i++)//将不在矩阵中的数据清除
for (j = 0; j < 4; j++)
s[j][i] = 0;
}
void MATRIX_add(double(*s)[4], double(*t)[4], double(*p)[4], int m, int n, double b)//相加
{
int i, j;
b = 1;
for (i = 0; i < m; i++)
for (j = 0; j < n; j++)
p[i][j] = s[i][j] + t[i][j];
}
void MATRIX_multi(double(*s)[4], double(*t)[4], double(*p)[4], int m, int n, double x, double y) {
int i, j, k;
double sum;
for (i = 0; i < m; i++)
{
for (j = 0; j < y; j++)
{
sum = 0;
for (k = 0; k < n; k++)
sum += s[i][k] * t[k][j];
p[i][j] = sum;
}
}
}
void MATRIX_trans(double(*s)[4], double(*t)[4], int m, int n)//转置
{
int i, j;
for (i = 0; i < m; i++)
for (j = 0; j < n; j++)
t[j][i] = s[i][j];
}
void MATRIX_shucheng(double(*s)[4], double(*t)[4], int m, int n, double k)//数乘
{
int i, j;
for (i = 0; i < m; i++)
for (j = 0; j < n; j++)
t[i][j] = k * s[i][j];
}
void MATRIX_getCOS(int m, int n, double(*s)[4], double(*t)[4], int mn) {//余子式
m -= 1;
n -= 1;//数学逻辑和电脑逻辑差1
int i, j, k = 0, l = 0;
for (i = 0; i < mn; i++) {
for (j = 0; j < mn; j++) {
if (i != m && j != n) t[k][l++] = s[i][j];
if (l == mn - 1) { k++; l = 0; }
}
}
}
double MATRIX_value(double(*s)[4], int MatrixSize) {//行列式
double matrix[4][4], tempmatrix[4][4];
int i, j;
//赋值给matrix 交给matrix去计算
for (i = 0; i < MatrixSize; i++)
for (j = 0; j < MatrixSize; j++)
matrix[i][j] = s[i][j];
//一阶二阶 行列式求值
if (MatrixSize == 2)
return matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0];
else if (MatrixSize == 1)
return matrix[0][0];
else//高阶行列式求值
{
double Matrixvalue = 0;//CurrentMatrix的值
for (i = 0; i < MatrixSize; i++)
{
MATRIX_getCOS(1, i + 1, matrix, tempmatrix, MatrixSize);//得到第一行 第i列 的 当前余子式 tempmatrix
if (i % 2 == 1)//因为 是 行项为1 所以 列项i为奇数时 逆序数为偶数
Matrixvalue -= matrix[0][i] * MATRIX_value(tempmatrix, MatrixSize - 1);
else
Matrixvalue += matrix[0][i] * MATRIX_value(tempmatrix, MatrixSize - 1);
}
return Matrixvalue;
}
}
void MATRIX_inverse(double(*s)[4], double(*t)[4], int MatrixSize) {
int i, j;
double matrix[4][4], tempmatrix[4][4], tempmatrix2[4][4], tempmatrix3[4][4];
for (i = 0; i < MatrixSize; i++)
for (j = 0; j < MatrixSize; j++) matrix[i][j] = s[i][j];
for (i = 0; i < MatrixSize; i++) {
for (j = 0; j < MatrixSize; j++) {
MATRIX_getCOS(i + 1, j + 1, matrix, tempmatrix, MatrixSize);//算余子式
tempmatrix2[i][j] = MATRIX_value(tempmatrix, 2);//算余子式的行列式
}
}
MATRIX_trans(tempmatrix2, tempmatrix3, MatrixSize, MatrixSize);//转置
for (i = 0; i < MatrixSize; i++)
for (j = 0; j < MatrixSize; j++)
if ((i + j) % 2 == 1)
tempmatrix3[i][j] = -tempmatrix3[i][j];//所需处化为相反数
MATRIX_shucheng(tempmatrix3, t, MatrixSize, MatrixSize, 1 / MATRIX_value(s, MatrixSize));//除以原矩阵行列式
}