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

 

posted @ 2025-08-16 16:49  与f  阅读(10)  评论(0)    收藏  举报