首页 > 其他分享 >稀疏矩阵

稀疏矩阵

时间:2023-09-15 12:31:46浏览次数:37  
标签:11 sparseArray int 矩阵 稀疏 数组

1、稀疏矩阵的定义:

如果一个二维数组中有很多无效的数据,那么这些无效的数据就会导致大量的磁盘空间浪费,这个时候我们就可以考虑使用稀疏矩阵来存放有效数据,将原数组压缩成一个行数为有效数据之和加一,列数为三的二维数据 ,==其中这个二维数据的第一列表示有效数据在原数组中存放的行号,第二列表示有效数据在原数组中存放的列号,第三列表示有效数据的值,并且这个二维数组的第一行分别为:原数组的行数,原数组的列数,有效数据的个数。==

用Java实现如下所示(假如矩阵如下所示): image.png

public class Test {
    public static void main(String[] args) {
        //创建二维数组
        int[][] array = new int[11][11];
        //给二维数组赋值
        array[1][2] = 1;
        array[2][4] = 2;

        //遍历原始数组
        System.out.println("原始数组如下所示:");
        showArray(array);
        System.out.println("-----------------------------------------");


        //压缩至稀疏数组
        //统计原数组中的有效数据
        int sum = 0;
        for (int i = 0; i < 11; i++) {
            for (int j = 0; j < 11; j++) {
                if (array[i][j] != 0) {
                    sum++;
                }
            }
        }

        //定义一个稀疏数组
        int[][] sparseArray = new int[sum + 1][3];      //行数为有效数据和+1
        //初始化稀疏矩阵的第一行
        sparseArray[0][0] = 11;
        sparseArray[0][1] = 11;
        sparseArray[0][2] = sum;


        //指向稀疏数组中行的指针
        int count = 0;
        //遍历数组,并且将有效数据放入稀疏矩阵中
        for (int i = 0; i < 11; i++) {
            for (int j = 0; j < 11; j++) {
                if (array[i][j] != 0) {
                    //指针往后移一位
                    count++;
                    sparseArray[count][0] = i;
                    sparseArray[count][1] = j;
                    sparseArray[count][2] = array[i][j];
                }
            }
        }

        System.out.println("稀疏矩阵如下所示:");
        showArray(sparseArray);
        System.out.println("-----------------------------------------");

        //将稀疏数组转换为原数组
        //获取原数组的大小
        int row = sparseArray[0][0];
        int col = sparseArray[0][1];

        //创建原二维数组
        int[][] oldArray = new int[row][col];
        //将有效数据放入原数组中
        for (int i = 1; i <= sum; i++) {
            int num1 = sparseArray[i][0];       //要在原数组中存放的行号
            int num2 = sparseArray[i][1];       //要在原数组中存放的列号
            //将有效数据存放在原数组中
            oldArray[num1][num2] = sparseArray[i][2];
        }

        System.out.println("通过稀疏矩阵还原原矩阵如下所示:");
        showArray(oldArray);


    }

    //遍历数组的方法
    public static void showArray(int[][] array) {
        //行数
        int row = array.length;
        //列数
        int col = array[0].length;
        //循环遍历
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < col; j++) {
                System.out.print(array[i][j] + "\t");
            }
            System.out.println();
        }

    }
    
}

输出结果为:

原始数组如下所示:
0	0	0	0	0	0	0	0	0	0	0	
0	0	1	0	0	0	0	0	0	0	0	
0	0	0	0	2	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
-----------------------------------------
稀疏矩阵如下所示:
11	11	2	
1	2	1	
2	4	2	
-----------------------------------------
通过稀疏矩阵还原原矩阵如下所示:
0	0	0	0	0	0	0	0	0	0	0	
0	0	1	0	0	0	0	0	0	0	0	
0	0	0	0	2	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	

进程已结束,退出代码0

标签:11,sparseArray,int,矩阵,稀疏,数组
From: https://blog.51cto.com/u_15433911/7479956

相关文章

  • MATLAB:基本的数学运算与矩阵运算
    学习一门技术最好的方式就是阅读官方文档,你可以查看MATLAB官方文档MATLAB基本语法变量MATLAB中的变量不需要声明。使用=为变量赋值。变量名与大多数编程语言相同,MATLAB中的变量名是大小写敏感的。变量名只能由[0~9,a~z,A~Z,_]组成,且变量名不能以数字开头。保留变量......
  • 杨氏矩阵
    题目描述:有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在。根据题目要求我们可以利用二维数组实现一个杨氏矩阵。如下图所示,我们可以看到矩阵每行从左到右递增,从上到下递增。在这样的二维数组中去查找一个数是否存在,我......
  • 透视投影矩阵的生成
    为何最新的OpenGL看不到gluPerspectiveAPI最新版本的OpenGL(OpenGL3.1及更高版本)中取消了对GLU(OpenGLUtilityLibrary)的支持。GLU是一个辅助库,提供了一些便捷的函数和工具函数,用于简化OpenGL编程过程。其中包括gluPerspective函数,用于生成透视投影矩阵。OpenGL的设计哲学......
  • 协方差矩阵
     概念协方差(Covariance)在概率论和统计学中用于衡量两个变量的总体误差。而方差是协方差的一种特殊情况,即当两个变量是相同的情况。其实简单来讲,协方差就是衡量两个变量相关性的变量。当协方差为正时,两个变量呈正相关关系(同增同减);当协方差为负时,两个变量呈负相关关系(一增一减)。......
  • 矩阵快速幂--模板
    http://acm.bit.edu.cn/mod/programming/view.php?id=670TheLittleArchitectII#include<stdio.h>#include<string.h>//dp方程:f[n]=3*f[n-1]+3*f[n-2]-f[n-3];//矩阵快速幂。。模板//构造矩阵//310//301//-100structnode{ longlonga[3][3];};lon......
  • LeetCode59.螺旋矩阵II
    LeetCode59.螺旋矩阵IIhttps://leetcode.cn/problems/spiral-matrix-ii/学习内容螺旋矩阵题,就是给你一个矩阵的长度n,去返回一个螺旋表示的二维数组。如n=3时,返回的二维数组为:123894765解题的关键点,是考虑边界上的点怎么处理,通过遍历圈数+遍历每个边来输出二维数组。当每次转圈时......
  • 什么是项目管理里的需求跟踪矩阵?
     需求跟踪矩阵(RequirementsTraceabilityMatrix,RTM)是项目管理和质量管理中的一个工具,用于跟踪项目需求与其来源以及如何满足这些需求的文档或活动之间的关系。其主要目的是确保项目满足所有定义的需求,同时为相关方提供一个清晰的视图,显示需求如何在项目的......
  • 【学习笔记】【自学】【模板】矩阵快速幂
    题目描述:给定$n\timesn$的矩阵$A$,求$A^k$。矩阵:一个$m\timesn$的矩阵是一个由$m$行$n$列元素排列成的矩形阵列。即形如$$A=\begin{bmatrix}a_{11}&a_{12}&\cdots&a_{1n}\\a_{21}&a_{22}&\cdots&a_{2n}\\\vdots&\vdots&......
  • 矩阵
             ......
  • 矩阵快速幂
    矩阵乘法的定义矩阵A*矩阵B=矩阵C                         性质:满足结合律,分配率,但不满足交换律矩阵乘法的特殊情形矩阵A是一个N*N的矩阵,矩阵F是一个N*1的矩阵,设F1=A*F,发现F1也是一个N*1的矩阵,只有一行......