c语言把两个对称矩阵存为一维数组,再求出两个对称矩阵的乘积
c语言把两个对称矩阵存为一维数组,再求出两个对称矩阵的乘积
对称矩阵为了节省存储空间,有时候会把它存为一维数组。如果存为一维数组怎么求出他们的乘积呢?
//对称矩阵,使用下三角存储为一维数组,然后两个对称矩阵相乘, //写出实现 //疑问,对称矩阵和对称矩阵相乘,还是对称矩阵吗,怎么存储.(答可能不是对称数组,按照二维数组存储) #include <stdio.h> //例子,要处理3行3列的对称矩阵 #define ROWS 3 #define COLS 3 //对称矩阵如果要存储为一维数组,一共占多大空间(等差数列求和公式) #define LEN (ROWS * (ROWS + 1) / 2) //获得对称矩阵元素的值 int getArrayVal(int tmp[], int m, int n){ int index; if(m>=n) { index = (m*(m+1) / 2) + n; }else{ index = (n*(n+1) / 2 )+ m; } return tmp[index]; } //矩阵计算的结果 //存储A矩阵的,一维数组a[] //存储B矩阵的,一维数组b[] //i , j 结果矩阵的某个点 int slc(int a[], int b[], int m, int n){ int tmp = 0; for (int i = 0; i < ROWS; i++) //tmp += A[m][i] * B[i][n]; //实际相乘的元素 tmp += getArrayVal(a,m,i)* getArrayVal(b,i,n); //获取对称矩阵(一维数组),某行某列的值,再相乘 return tmp; } int main(){ int i,j; //对称数组的长度为 //int lenght = (ROWS * (ROWS + 1) / 2); printf("%d \n",LEN); // 对称矩阵a // 1 2 3 // 2 4 5 // 3 5 1 // 对称矩阵b // 4 6 7 // 6 9 8 // 7 8 4 //这样的对称矩阵,存储只存储下半部,并且保存再一维数组里面 int a[LEN] = {1,2,4,3,5,1}; int b[LEN] = {4,6,9,7,8,4}; int c[ROWS][COLS]; for(i=0;i<ROWS;i++) for (j = 0; j < COLS; j++) c[i][j] = slc(a,b,i,j); //输出数组 for(i=0;i<ROWS;i++) for (j = 0; j < COLS; j++) { printf("%d \t",c[i][j]); if(j==COLS-1) printf("\n"); } return 0; }