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; }