Java数据结构-实现矩阵的相关运算:加减乘、转置和压缩稀疏矩阵

设置字体大小:

自从回到家就忘记了学习,今天好不容易想起来要学习了赶紧记录一下,也算是督促自己了 :!:

这篇将用Java实现矩阵和矩阵的相关运算:加法、减法、乘法、矩阵的转置、稀疏矩阵的随机产生和压缩存储等。以下内容全部是代码 :(呵呵)

一、Matrix 类

具体可以看代码注释,如果不懂可以在文章后面评论我再一一添加。

//2018年1月30日 Matrix.java
package 矩阵;

import java.util.Scanner;
import java.util.Random;

public class Matrix {
	private int row = 0;  //行
	private int col = 0;  //列
	private int[][] matrix; //用二维数组来存放矩阵的值
	/**
	 * @return row
	 */
	public int getRow() {
		return row;
	}
	/**
	 * @param row 要设置的 row
	 */
	public void setRow(int row) {
		if (row>=0) {
			this.row = row;
		}
		else {
			System.err.println("错误:行数小于0");
			System.exit(0);
		}
	}
	/**
	 * @return col
	 */
	public int getCol() {
		return col;
	}
	/**
	 * @param col 要设置的 col
	 */
	public void setCol(int col) {
		if (col>=0) {
			this.col = col;
		} else {
			System.err.println("错误:列数小于0");
			System.exit(0);
		}
		
	}
	/**
	 * @return matrix
	 */
	public int[][] getMatrix() {
		return matrix;
	}
	/**
	 * @param matrix 要设置的 matrix
	 */
	public void setMatrix(int[][] matrix) {
		this.matrix = matrix;
	}
	/**
	 * 构造函数
	 * @param row
	 * @param col
	 * @param matrix
	 */
	public Matrix(int row, int col, int[][] matrix) {
		setRow(row);
		setCol(col);
		setMatrix(matrix);
	}
	/**
	 * 默认的构造函数,初始化矩阵的值为0
	 */
	public Matrix() {
		this.matrix = new int [this.row][this.col];
	}
	/**
	 * 参数为行和列的构造函数,同时初始化矩阵值为0
	 * @param row
	 * @param col
	 */
	public Matrix(int row, int col) {
		setRow(row);
		setCol(col);
		this.matrix = new int [row][col];
	}
	/**
	 * 随机初始化矩阵的值
	 */
	public void randomInitAMatrix() {
		Random random = new Random();
		for (int i = 0; i < this.row; i++) {
			for (int j = 0; j < this.col; j++) {
				this.matrix[i][j] = random.nextInt(10);
			}
		}
	}
	/**
	 * 由用户输入矩阵的值
	 */
	public void inputAMatrix() {
		Scanner in = new Scanner(System.in);
		for (int i = 0; i < this.row; i++) {
			for (int j = 0; j < this.col; j++) {
				System.out.println("请输入a["+i+"]["+j+"]:");
				this.matrix[i][j] = in.nextInt();
			}
		}
	}
	/**
	 * 打印出矩阵的值
	 */
	public void printAMatrix() {
		for (int i = 0; i < this.row; i++) {
			for (int j = 0; j < this.col; j++) {
				System.out.print(this.matrix[i][j]+"\t");
			}
			System.out.println("");
		}
	}
	/**
	 * 两个矩阵的加法,其中被加数为本矩阵,加数是参数,矩阵对象B
	 * @param B 加数
	 * @return 返回一个矩阵对象,是两个矩阵的和
	 */
	public Matrix matrixAdd(Matrix B) {
		if (this.row == B.row && this.col == B.col) {
			Matrix sumC = new Matrix(this.row,this.col);
			
			for (int i = 0; i < this.row; i++) {
				for (int j = 0; j < this.col; j++) {
					sumC.matrix[i][j] = this.matrix[i][j] + B.matrix[i][j];
				}
			}
			
			return sumC;
		}
		else {
			System.err.println("错误:两个矩阵的行或列不相等");
			return null;
		}
	}
	
	/**
	 * 矩阵的减法,被减数是调用此方法的矩阵对象,减数为参数,矩阵对象B
	 * @param B 减数
	 * @return 返回一个矩阵对象,即相减的结果
	 */
	public Matrix matrixSub(Matrix B) {
		if (this.row == B.row && this.col == B.col) {
			Matrix subC = new Matrix(this.row,this.col);
			
			for (int i = 0; i < this.row; i++) {
				for (int j = 0; j < this.col; j++) {
					subC.matrix[i][j] = this.matrix[i][j] - B.matrix[i][j];
				}
			}
			
			return subC;
		}
		else {
			System.err.println("错误:两个矩阵的行或列不相等");
			return null;
		}
	}
	/**
	 * 矩阵相乘,本矩阵乘以参数,即矩阵B
	 * @param B 另一个乘数
	 * @return Matrix 对象,即矩阵相乘的结果
	 */
	public Matrix matrixMul(Matrix B) {
		if (this.col == B.row) {
			Matrix mulC = new Matrix(this.row, B.col);
			
			for (int i = 0; i < this.row; i++) {
				for (int j = 0; j < B.col; j++) {
					int temp = 0;
					for (int k = 0; k < this.col; k++) {
						temp += this.matrix[i][k] * B.matrix[k][j];
					}
					mulC.matrix[i][j] = temp;
				}
			}
			
			return mulC;
		}
		else {
			System.err.println("错误:不满足矩阵相乘的条件");
			return null;
		}
	}
	/**
	 * 矩阵的转置
	 * @return 返回矩阵转置后的结果
	 */
	public Matrix transposeMatrix() {
		Matrix transposedMatrix = new Matrix(this.row, this.col);
		
		for (int i = 0; i < this.row; i++) {
			for (int j = 0; j < this.col; j++) {
				transposedMatrix.matrix[i][j] = this.matrix[j][i];
			}
		}
		
		return transposedMatrix;
	}
	/**
	 * 随机产生一个稀疏矩阵A
	 * @param A 要产生稀疏矩阵的矩阵对象
	 * @return 返回产生的稀疏矩阵
	 */
	static public Matrix createASparseMatrix(Matrix A) {
		Matrix temp = new Matrix(A.row, A.col);
		Random random = new Random();
		int zeroNum = 0;
		while (zeroNum == 0) {
			zeroNum = random.nextInt(A.col*A.row);
		}
		
		for (int tempZeroNum = 0; tempZeroNum < zeroNum; tempZeroNum++) {
			int temRow = random.nextInt(A.row);
			int temCol = random.nextInt(A.col);
			if (temp.matrix[temRow][temCol] != 0) {
				tempZeroNum--;
				continue;
			}
			while (temp.matrix[temRow][temCol] == 0) {
				temp.matrix[temRow][temCol] = random.nextInt(20);
			}
		}
		return temp;
	}
	/**
	 * 压缩稀疏矩阵为一个三元组,也是一个矩阵,m行3列
	 * m=稀疏矩阵中非零元素的个数+1,即zeroNum+1
	 * 三元组的第0行为(稀疏矩阵的行值,稀疏矩阵的列值,稀疏矩阵中非零元素个数)
	 * 其他行则是每一个非零元素的行值、列值、值
	 * @param A 要压缩的稀疏矩阵
	 * @return 压缩之后的矩阵对象,即一个三元组
	 */
	static public Matrix compressSparseMatrix(Matrix A) {
		int zeroNum = 0;
		//A中非零元素的个数
		for (int i = 0; i < A.row; i++) {
			for (int j = 0; j < A.col; j++) {
				if (A.matrix[i][j] != 0) {
					zeroNum ++;
				}
			}
		}
		Matrix compressedSparseMatrix = new Matrix(zeroNum+1, 3); //三元组
		compressedSparseMatrix.matrix[0][0] = A.row;
		compressedSparseMatrix.matrix[0][1] = A.col;
		compressedSparseMatrix.matrix[0][2] = zeroNum;
		int tmpCow = 1;
		//开始压缩
		for (int i = 0; i < A.row; i++) {
			for (int j = 0; j < A.col; j++) {
				if (A.matrix[i][j] != 0) {
					compressedSparseMatrix.matrix[tmpCow][0] = i;
					compressedSparseMatrix.matrix[tmpCow][1] = j;
					compressedSparseMatrix.matrix[tmpCow][2] = A.matrix[i][j];
					tmpCow++;
				}
			}
		}
		
		return compressedSparseMatrix;
	}
}

 

二、主函数&&三、运行结果

见下一页


版权说明:
作品 sunriseydy 采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
文章内容如未说明均为原创,欢迎转载,但请注明原作者(sunriseydy)和原文链接(https://blog.sunriseydy.top/technology/code/java/java-matrix/)。部分来自互联网的文章,如有侵权,请联系我,24小时内删除,谢谢

赞 (0)   -->微信赞赏<--

微信扫描下方左侧二维码或搜索“sunriseydy”关注我的公众号,便捷地阅读博客内容,订阅博客更新
也可以扫描下方右侧的小程序码,进入我的微信小程序:“sunriseydy”,在手机上阅读文章

      

评论一下呗亲

电子邮件地址不会被公开。 必填项已用*标注

添加表情