矩阵的测试

1.利用已知矩阵arr测试逆矩阵

2.随机产生一个3阶矩阵,判断是否存在逆矩阵,若存在则计算输出逆矩阵

代码如下:

public class InverseMatrix {
	private int row;
	private int col;
	private double[][] matrix;
	public InverseMatrix(){//构造默认矩阵
		this.row = 3;
		this.col = 3;
		this.matrix = new double[this.row][this.col];
	}
	public InverseMatrix(int row,int col){//构造随机矩阵
		this.row = row;
		this.col = col;
		this.matrix = new double[this.row][this.col];
		//对随机矩阵进行赋值操作
		for(int i=0;i<matrix.length;i++){
			for(int j=0;j<matrix[i].length;j++){
				Random rand = new Random();
				matrix[i][j] = rand.nextInt(10);
			}
		}
	}
	//求矩阵的余子式(minors)     传入参数矩阵和某一个元素的(x,y)坐标
	public static double[][] minors(double[][] ma,int x,int y){
		double[][] newMatrix = new double[ma.length-1][ma[0].length-1];
		for(int i=0;i<newMatrix.length;i++){
			if(i < x){
				for(int j=0;j<newMatrix[i].length;j++){
					if(j < y){
						newMatrix[i][j] = ma[i][j];
					}else{
						newMatrix[i][j] = ma[i][j+1];
					}
				}
			}else{
				for(int j=0;j<newMatrix[i].length;j++){
					if(j < y){
						newMatrix[i][j] = ma[i+1][j];
					}else{
						newMatrix[i][j] = ma[i+1][j+1];
					}
				}
			}
		}
		return newMatrix;
	}
	//求矩阵行列式的值(若返回值为0则表示不存在逆矩阵)
	public static double determinant(double[][] ma){
		//二阶行列式
		if(ma.length == 2){
			return ma[0][0]*ma[1][1] - ma[0][1]*ma[1][0];
		}
		//三阶行列式及以上
		//第一行的各元素与代数余子式乘积  然后累加就是行列式的值
		double[] num = new double[ma[0].length];
		for(int i=0;i<num.length;i++){//遍历第一行元素
			if(i%2 == 0){
				num[i] = ma[0][i]*determinant(minors(ma,0,i));
			}else{
				num[i] = -ma[0][i]*determinant(minors(ma,0,i));
			}
		}
		double result = 0;
		for(int i=0;i<num.length;i++){
			result += num[i];
		}
		return result;
	}
	//求转置矩阵
	public static double[][] reverse(double[][] ma){
		double[][] reveMatrix = new double[ma.length][ma[0].length];
		for(int i=0;i<reveMatrix.length;i++){
			for(int j=0;j<reveMatrix[i].length;j++){
				reveMatrix[i][j] = ma[j][i];
			}
		}
		return reveMatrix;
	}
	//求逆矩阵
	public static double[][] inMatix(double[][] ma){
		//传入矩阵的行行列式的值
		double num = determinant(ma);
		//求伴随矩阵(每个元素的代数余子式转置)
		double[][] newMatrix = new double[ma.length][ma[0].length];
		for(int i=0;i<newMatrix.length;i++){
			for(int j=0;j<newMatrix[i].length;j++){
				if((i+j)%2 == 0){
					newMatrix[i][j] = determinant(minors(ma,i,j))/num;
				}else{
					newMatrix[i][j] = -determinant(minors(ma,i,j))/num;
				}
			}
		}
		//转置后得到伴随矩阵
		return reverse(newMatrix);
	}
	public static void main(String[] args) {
		double[][] arr = new double[][]{
//			{1,2,-1},
//			{3,4,-2},
//			{5,-4,1}
			{0,2,-1},
			{0,4,-2},
			{0,-4,1}//此矩阵没有逆矩阵
		};
		//用指定矩阵进行测试:
		System.out.println("arr矩阵为:");
		printMatrix(arr);
		if(determinant(arr) == 0){
			System.out.println("arr矩阵没有逆矩阵");
		}else{
			
			System.out.println("arr矩阵的逆矩阵为:");
			printMatrix(inMatix(arr));
		}
		
		//用产生的随机矩阵进行测试
		InverseMatrix m = new InverseMatrix(3,3);
		System.out.println("系统产生的随机矩阵为:");
		m.printMatrix(m.matrix);
		if(determinant(m.matrix) == 0){
			System.out.println("随机矩阵没有逆矩阵");
		}else{
			System.out.println("随机矩阵的逆矩阵为:");
			printMatrix(inMatix(m.matrix));
		}
		
	}
	//输出矩阵
	public static void printMatrix(double[][] ma){
		for(int i=0;i<ma.length;i++){
			for(int j=0;j<ma[i].length;j++){
				System.out.printf("%-8.2f",ma[i][j]);
			}
			System.out.println();
		}
	}
}
测试结果如下:

arr矩阵为:
0.00    2.00    -1.00   
0.00    4.00    -2.00   
0.00    -4.00   1.00    
arr矩阵没有逆矩阵
系统产生的随机矩阵为:
7.00    1.00    5.00    
1.00    6.00    6.00    
4.00    7.00    2.00    
随机矩阵的逆矩阵为:
0.11    -0.12   0.09    
-0.08   0.02    0.14    
0.06    0.16    -0.15   



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
回答: Verilog的矩阵测试是一种用于测试矩阵键盘的方法。矩阵键盘的原理是通过分行和列扫描来确定按下按键的行数和列数,并得到按下按键的键值。在Verilog中,可以使用矩阵测试来模拟和验证矩阵键盘的功能。 矩阵测试的基本原理是通过不断的扫描来确认键盘的值。首先,将四个横行或竖列设置为输出模式,另外四个设置为输入模式。然后,通过扫描输出高电平,如果检测到高电平,则表示该行或列有按键按下。接着切换输入输出,扫描另外四个,以确定按键按下的位置。通过这种方式,可以模拟和验证矩阵键盘的工作原理。 在Verilog中,可以使用模块化的方式来设计矩阵测试程序。可以将键盘扫描和数码管显示两个部分分开设计,并在测试程序中进行组合。键盘扫描部分负责扫描键盘并获取键值,而数码管显示部分负责将键值显示在数码管上。通过这种方式,可以实现对矩阵键盘的完整测试。 总结起来,Verilog的矩阵测试是一种用于测试矩阵键盘的方法,通过模拟和验证矩阵键盘的工作原理,可以确保键盘的正常功能。 #### 引用[.reference_title] - *1* [基于Verilog的矩阵键盘实现](https://blog.csdn.net/jianfeng_520/article/details/117992432)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [基于FPGA的4x4矩阵键盘控制器verilog开发实现](https://blog.csdn.net/ccsss22/article/details/128085602)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

荒--

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值