
三对角矩阵如上图,红框部分是我们在数组中存储的部分。
三对角的特点:|行标i-列标j|<=1的位置上才会有非零元素。其余位置都是0元素
三对角矩阵矩阵下标和数组下标的映射关系是:? ? ?2*i+j-3
代码实现及结果测试:
#include<stdio.h>
#include<stdlib.h>
#define N 6 //N为对称矩阵的阶数
/*
三对角矩阵需要的数组大小是 3*N-2
三对角矩阵的特点: |行标i-列标j|<=1的位置上才会有非零元素。
三对角矩阵矩阵下标和数组下标的映射关系是: 2*i+j-3
*/
void storageValue(int array[] , int i, int j , int e){
//只存储三对角矩阵元素
array[2*i+j-3] = e;
}
//对称矩阵中元素的获取 ij是矩阵元素的下标
int getValue(int array[],int i,int j) {
if(abs(i-j)<=1){
return array[2*i+j-3];
}else{
return 0;
}
}
int main(int argc, char *argv[])
{
//用二维数组模拟一个对称矩阵.
int matrix[N][N] = {
{1,2,0,0,0,0},
{3,4,5,0,0,0},
{0,6,7,8,0,0},
{0,0,9,10,11,0},
{0,0,0,12,13,14},
{0,0,0,0,15,16},
};
int *array =(int *)malloc(sizeof(int)*(3*N-2));
for(int i = 0;i<N;i++){
for(int j = 0;j<N;j++){
//只有|i-j|<=1位置上的元素我们才需要存储
if(abs(i-j)<=1){
//这里 i+1 j+1 是矩阵下标是从1开始,而不是0. matrix[0][0] 其实是矩阵中的a11.
storageValue(array,(i+1),(j+1),matrix[i][j]);
}
}
}
//打印array数组中存储的元素
for(int i = 0;i<3*N-2;i++){
printf("array数组中的元素是%d\n",*(array+i));
}
//访问矩阵的第三行、第二个元素
int value = getValue(array,3,2);
printf("矩阵中的第三行第二个元素是%d\n",value);
//访问矩阵的第四行、第六个元素
int value2 = getValue(array,4,6);
printf("矩阵中的第二行第四个元素是%d\n",value2);
return 0;
}

?
|