我是靠谱客的博主 热心万宝路,最近开发中收集的这篇文章主要介绍上三角、下三角、对称矩阵,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

说明

 上三角矩阵是矩阵在对角线以下的元素均为0,即Aij = 0,i > j,例如:

1  2  3   4   5

0  6  7   8   9

0  0  10   11  12

0  0  0   13  14

0  0  0   0  15

下三角矩阵是矩阵在对角线以上的元素均为0,即Aij = 0,i < j,例如:

 1  0  0  0  0

 2  6  0  0  0

 3  7  10 0  0

 4  8  11 13 0

 5  9  12 14 15

对称矩阵是矩阵元素对称于对角线,例如:

 1  2  3  4  5

 2  6  7  8  9

 3  7  10 11 12

 4  8  11 13 14

 5  9  12 14 15

上三角或下三角矩阵也有大部份的元素不储存值(为0),我们可以将它们使用一维阵列来储存以节省储存空间,而对称矩阵因为对称于对角线,所以可以视为上三角或下三角矩阵来储存。

解法

 假设矩阵为nxn,为了计算方便,我们让阵列索引由1开始,上三角矩阵化为一维阵列,若以列为主,其公式为:loc = n*(i-1) - i*(i-1)/2 + j

化为以行为主,其公式为:loc = j*(j-1)/2 + i

下三角矩阵化为一维阵列,若以列为主,其公式为:loc = i*(i-1)/2 + j

若以行为主,其公式为:loc = n*(j-1) - j*(j-1)/2 + i

公式的导证其实是由等差级数公式得到,您可以自行绘图并看看就可以导证出来,对于C/C++或Java等索引由0开始的语言来说,只要将i与j各加1,求得loc之后减1即可套用以上的公式。

代码部分

#include <stdio.h> 
#include <stdlib.h> 
#define N 5 

int main(void) { 
    int arr1[N][N] = { 
        {1, 2, 3,  4,   5}, 
        {0, 6, 7,  8,   9}, 
        {0, 0, 10, 11, 12}, 
        {0, 0, 0,  13, 14}, 
        {0, 0, 0,  0,  15}}; 

    int arr2[N*(1+N)/2] = {0}; 

    int i, j, loc = 0; 

    printf("原二维资料:n"); 
    for(i = 0; i < N; i++) { 
        for(j = 0; j < N; j++) { 
            printf("%4d", arr1[i][j]); 
        } 
        printf("n"); 
    } 

    printf("n以列为主:"); 
    for(i = 0; i < N; i++) { 
        for(j = 0; j < N; j++) { 
            if(arr1[i][j] != 0) 
                arr2[loc++] = arr1[i][j]; 
        } 
    } 
    for(i = 0; i < N*(1+N)/2; i++) 
        printf("%d ", arr2[i]); 

    printf("n输入索引(i, j):"); 
    scanf("%d, %d", &i, &j); 
    loc = N*i - i*(i+1)/2 + j; 
    printf("(%d, %d) = %d", i, j, arr2[loc]); 

    printf("n"); 
    return 0; 
} 

最后

以上就是热心万宝路为你收集整理的上三角、下三角、对称矩阵的全部内容,希望文章能够帮你解决上三角、下三角、对称矩阵所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(62)

评论列表共有 0 条评论

立即
投稿
返回
顶部