DAY31 整数矩阵及其运算

本次代码通过IntMatrix类封装了二维整数矩阵的核心操作,思路如下:数据封装→基础操作(修改和获取元素、获取维度,toString返回字符串表示,getData返回内部数组引用)→矩阵运算(实现矩阵加法和乘法)→功能演示(main方法)证类的功能。

1.声明变量
声明了一个名为data的变量,其类型是int[][],表示这是一个二维整数数组
此处仅声明变量,未初始化

	/*** The data.*/int[][] data;

2.初始化一个整数矩阵(第一个构造方法)
这个构造方法的作用是根据指定的行数和列数,初始化矩阵的存储空间。
接收两个int类型参数:paraRows(行数)和paraColumns(列数)

	/************************ The first constructor.* * @param paraRows*            The number of rows.* @param paraColumns*            The number of columns.**********************/public IntMatrix(int paraRows, int paraColumns) {data = new int[paraRows][paraColumns];}// Of the first constructor

3.创建给定矩阵的副本(第二个构造方法)
通过一个已有的二维整数数组创建一个新的IntMatrix对象(实现矩阵的复制功能)

	/************************ The second constructor. Construct a copy of the given matrix.* * @param paraMatrix*            The given matrix.**********************/public IntMatrix(int[][] paraMatrix) {data = new int[paraMatrix.length][paraMatrix[0].length];// Copy elements.for (int i = 0; i < data.length; i++) {for (int j = 0; j < data[0].length; j++) {data[i][j] = paraMatrix[i][j];} // Of for j} // Of for i}// Of the second constructor

4.创建给定矩阵的副本(第三个构造方法)
这行代码实际是调用了当前类的第二个构造方法(接收int[][]参数的那个),将已有IntMatrix对象的内部数据数组作为参数传入
这种通过this()调用其他构造方法的方式称为构造方法重载复用,避免了代码重复,提高了代码的可维护性

	/************************ The third constructor. Construct a copy of the given matrix.* * @param paraMatrix*            The given matrix.**********************/public IntMatrix(IntMatrix paraMatrix) {this(paraMatrix.getData());}// Of the third constructor

5.getIdentityMatrix方法获取单位矩阵
①IntMatrix resultMatrix = new IntMatrix(paraRows, paraRows);
创建一个新的IntMatrix对象,行数和列数都是paraRows(即创建一个方阵)
此时矩阵中所有元素默认值为 0(因为int类型数组的默认值是 0)
②通过循环设置对角线元素为 1
循环变量i同时表示行索引和列索引
将矩阵中(i,i)位置的元素(即主对角线上的元素)设置为 1
注释提到 “根据访问控制,resultMatrix.data 可以被直接访问”,说明data成员变量的访问权限允许在类内部直接操作
③return resultMatrix;返回创建好的单位矩阵对象

	/************************ Get identity matrix. The values at the diagonal are all 1.* * @param paraRows*            The given rows.**********************/public static IntMatrix getIdentityMatrix(int paraRows) {IntMatrix resultMatrix = new IntMatrix(paraRows, paraRows);for (int i = 0; i < paraRows; i++) {// According to access control, resultMatrix.data can be visited// directly.resultMatrix.data[i][i] = 1;} // Of for ireturn resultMatrix;}// Of getIdentityMatrix

6.字符串表示以及获取内部数据
重写toString()方法,用于返回矩阵的字符串表示形式
返回类中存储矩阵数据的二维数组data的引用,用于外部获取矩阵的原始数据。

	/************************ Overrides the method claimed in Object, the superclass of any class.**********************/public String toString() {return Arrays.deepToString(data);}// Of toString/************************ Get my data. Warning, the reference to the data instead of a copy of the* data is returned.* * @return The data matrix.**********************/public int[][] getData() {return data;}// Of getData

7.getRows() 方法获取矩阵行数
二维数组data的length属性表示数组的行数(即第一维的长度)。
因此直接返回data.length即可得到矩阵的行数。

	/************************ Getter.* * @return The number of rows.**********************/public int getRows() {return data.length;}// Of getRows

8.getColumns() 方法获取矩阵列数
二维数组中,data[0]表示第一行的数组,其length属性即为该行的元素个数,也就是矩阵的列数(假设矩阵是规则的,即每行的列数相同)。
因此返回data[0].length可得到矩阵的列数。

	/************************ Getter.* * @return The number of columns.**********************/public int getColumns() {return data[0].length;}// Of getColumns

9.设置和获取矩阵元素值
setValue() 方法设置矩阵中指定位置(行、列)的元素值。
参数说明:
paraRow:元素所在的行索引(从 0 开始)
paraColumn:元素所在的列索引(从 0 开始)
paraValue:要设置的新值(整数类型)

	/************************ Set one the value of one element.* * @param paraRow*            The row of the element.* @param paraColumn*            The column of the element.* @param paraValue*            The new value.**********************/public void setValue(int paraRow, int paraColumn, int paraValue) {data[paraRow][paraColumn] = paraValue;}// Of setValue

getValue() 方法获取矩阵中指定位置(行、列)的元素值。
参数说明:
paraRow:元素所在的行索引(从 0 开始)
paraColumn:元素所在的列索引(从 0 开始)
返回值:指定位置的元素值(整数类型)。
实现逻辑:通过二维数组的索引访问data[paraRow][paraColumn],并返回该位置的元素值。

	/************************ Get the value of one element.* * @param paraRow*            The row of the element.* @param paraColumn*            The column of the element.**********************/public int getValue(int paraRow, int paraColumn) {return data[paraRow][paraColumn];}// Of getValue

10.add方法
用于将另一个矩阵与当前矩阵进行加法运算,并将结果存储在当前矩阵中。

步骤 1:获取传入矩阵的数据
通过paraMatrix.getData()获取传入矩阵的内部二维数组tempData(注意:这里获取的是引用,而非副本)。

		// Step 1. Get the data of the given matrix.int[][] tempData = paraMatrix.getData();

步骤 2:校验矩阵尺寸(核心前提)
矩阵加法的数学规则:只有行数和列数完全相同的两个矩阵才能相加。
代码通过两个if判断:
若当前矩阵的行数(data.length)与传入矩阵的行数(tempData.length)不相等,抛出异常。
若当前矩阵的列数(data[0].length)与传入矩阵的列数(tempData[0].length)不相等,抛出异常。
异常信息明确提示不匹配的维度,便于调试。

		// Step 2. Size check.if (data.length != tempData.length) {throw new Exception("Cannot add matrices. Rows not match: " + data.length + " vs. "+ tempData.length + ".");} // Of ifif (data[0].length != tempData[0].length) {throw new Exception("Cannot add matrices. Rows not match: " + data[0].length + " vs. "+ tempData[0].length + ".");} // Of if

步骤 3:执行加法运算
通过双重循环遍历两个矩阵的每个元素:
外层循环i遍历行索引,内层循环j遍历列索引。
执行data[i][j] += tempData[i][j],即当前矩阵的元素加上传入矩阵对应位置的元素,结果存回当前矩阵。
运算规则符合矩阵加法的定义:两个矩阵对应位置的元素相加。

		// Step 3. Add to me.for (int i = 0; i < data.length; i++) {for (int j = 0; j < data[0].length; j++) {data[i][j] += tempData[i][j];} // Of for j} // Of for i

11.静态add方法
用于对两个已存在的矩阵进行加法运算,并返回一个新的矩阵作为结果(不修改原矩阵)。

步骤 1:克隆第一个矩阵
IntMatrix resultMatrix = new IntMatrix(paraMatrix1);:通过IntMatrix的第三个构造方法,创建paraMatrix1的副本作为结果矩阵的初始值。
这一步确保原矩阵paraMatrix1不会被修改(与实例方法add的 “修改自身” 行为不同)。

		// Step 1. Clone the first matrix.IntMatrix resultMatrix = new IntMatrix(paraMatrix1);

步骤 2:执行矩阵加法
resultMatrix.add(paraMatrix2);:调用实例方法add,将paraMatrix2的元素加到resultMatrix中。
这里复用了之前实现的实例add方法的逻辑,包括尺寸校验和元素相加,避免代码重复。

		// Step 2. Add the second one.resultMatrix.add(paraMatrix2);return resultMatrix;

12.静态multiply方法
用于实现两个矩阵的乘法运算,并返回一个新的矩阵作为结果

方法定义与参数
public static IntMatrix multiply(…):静态方法,可通过类名直接调用,返回一个新的IntMatrix对象(乘法结果)。
参数paraMatrix1和paraMatrix2:分别表示要相乘的两个矩阵(左矩阵和右矩阵)。
throws Exception:声明可能抛出异常(当矩阵尺寸不满足乘法条件时)。

步骤 1:校验矩阵乘法的尺寸条件
由于矩阵乘法的数学规则:左矩阵的列数必须等于右矩阵的行数,否则无法相乘。
代码通过if (tempData1[0].length != tempData2.length)判断:
tempData1[0].length是左矩阵的列数
tempData2.length是右矩阵的行数
若不满足条件,抛出异常并提示不匹配的维度。

步骤 2:为结果矩阵分配空间
矩阵乘法的结果矩阵行数 = 左矩阵的行数,列数 = 右矩阵的列数。
因此创建int[][] resultData = new int[tempData1.length][tempData2[0].length],其中:
tempData1.length是左矩阵的行数(结果矩阵的行数)
tempData2[0].length是右矩阵的列数(结果矩阵的列数)

步骤 3:执行矩阵乘法运算(核心逻辑)
通过三重循环实现矩阵乘法:
外层循环i:遍历结果矩阵的行(对应左矩阵的行)
中层循环j:遍历结果矩阵的列(对应右矩阵的列)
内层循环k:计算结果矩阵(i,j)位置的元素值,公式为:

resultData[i][j] = sum(左矩阵[i][k] * 右矩阵[k][j]),其中k从0到左矩阵列数-1

符合矩阵乘法的数学定义:结果矩阵的每个元素是左矩阵对应行与右矩阵对应列的元素乘积之和。
步骤 4:返回结果矩阵
通过new IntMatrix(resultData)创建结果矩阵对象并返回,原矩阵paraMatrix1和paraMatrix2的数据不会被修改。

	/************************ Multiply two existing matrices.* * @param paraMatrix1*            The first matrix.* @param paraMatrix2*            The second matrix.* @return A new matrix.**********************/public static IntMatrix multiply(IntMatrix paraMatrix1, IntMatrix paraMatrix2)throws Exception {// Step 1. Check size.int[][] tempData1 = paraMatrix1.getData();int[][] tempData2 = paraMatrix2.getData();if (tempData1[0].length != tempData2.length) {throw new Exception("Cannot multiply matrices: " + tempData1[0].length + " vs. "+ tempData2.length + ".");} // Of if// Step 2. Allocate space.int[][] resultData = new int[tempData1.length][tempData2[0].length];// Step 3. Multiply.for (int i = 0; i < tempData1.length; i++) {for (int j = 0; j < tempData2[0].length; j++) {for (int k = 0; k < tempData1[0].length; k++) {resultData[i][j] += tempData1[i][k] * tempData2[k][j];} // Of for k} // Of for j} // Of for i// Step 4. Construct the matrix object.IntMatrix resultMatrix = new IntMatrix(resultData);return resultMatrix;}// Of multiply

13.main方法
作为程序的入口点,演示矩阵的创建、修改、乘法和加法等操作

	/************************ The entrance of the program.* * @param args*            Not used now.**********************/public static void main(String args[]) {IntMatrix tempMatrix1 = new IntMatrix(3, 3);tempMatrix1.setValue(0, 1, 1);tempMatrix1.setValue(1, 0, 1);tempMatrix1.setValue(1, 2, 1);tempMatrix1.setValue(2, 1, 1);System.out.println("The original matrix is: " + tempMatrix1);IntMatrix tempMatrix2 = null;try {tempMatrix2 = IntMatrix.multiply(tempMatrix1, tempMatrix1);} catch (Exception ee) {System.out.println(ee);} // Of trySystem.out.println("The square matrix is: " + tempMatrix2);IntMatrix tempMatrix3 = new IntMatrix(tempMatrix2);try {tempMatrix3.add(tempMatrix1);} catch (Exception ee) {System.out.println(ee);} // Of trySystem.out.println("The connectivity matrix is: " + tempMatrix3);}// Of main

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/91236.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/91236.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/91236.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

飞桨深度学习环境搭建

一、安装 PyCharm PyCharm 官网下载页面 记得全部勾选。 二、安装 miniconda miniconda 官网下载页面 根据你的操作系统选择。 记得勾选前三个。 三、安装 CUDA 首先 nvidia-smi 查看支持最高的 CUDA 版本。 然后去 nvidia 官网下载 CUDA&#xff0c;选择适合你的版本。 …

MySQL 8.0 OCP 1Z0-908 题目解析(37)

题目146 Choose two. Which two are true about binary logs used in asynchronous replication? □ A) The master connects to the slave and initiates log transfer. □ B) They contain events that describe all queries run on the master. □ C) They contain events …

vue element 封装表单

背景&#xff1a; 在前端系统开发中&#xff0c;系统页面涉及到的表单组件比较多&#xff0c;所以进行了简单的封装。封装的包括一些Form表单组件&#xff0c;如下&#xff1a;input输入框、select下拉框、等 实现效果&#xff1a; 理论知识&#xff1a; 表单组件官方链接&…

flutter-完美解决键盘弹出遮挡输入框的问题

文章目录1. 前言2. 借助 Scaffold 的特性自动调整3. 使用 MediaQuery 精准控制抬升高度3.1. 底部抽屉内输入框的方案4. 注意事项5. 总结1. 前言 在 Flutter 的开发过程中&#xff0c;经常会碰到某一个页面有个 TextField 输入组件&#xff0c;点击的时候键盘会弹起来&#xff…

机器学习笔记(四)——聚类算法KNN、Kmeans、Dbscan

写在前面&#xff1a;写本系列(自用)的目的是回顾已经学过的知识、记录新学习的知识或是记录心得理解&#xff0c;方便自己以后快速复习&#xff0c;减少遗忘。概念部分大部分来自于机器学习菜鸟教程&#xff0c;公式部分也会参考机器学习书籍、阿里云天池。机器学习如果只啃概…

【C#】事务(进程 ID 64)与另一个进程被死锁在锁资源上,并且已被选作死锁牺牲品。请重新运行该事务。不能在具有唯一索引“XXX_Index”的对象“dbo.Test”中插入重复键的行。

&#x1f339;欢迎来到《小5讲堂》&#x1f339; &#x1f339;这是《C#》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。&#x1f339; &#x1f339;温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01;&#…

LeetCode Hot 100 搜索二维矩阵

给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a;每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。给你一个整数 target &#xff0c;如果 target 在矩阵中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。示例…

python毕设高分案例:基于机器学习的抑郁症数据分析与预测系统,flask框架,算法包括XGboost模型、梯度提升树模型等

1 绪论 1.1 课题研究背景和意义 1.1.1 研究背景 在医疗行业不断发展的当下&#xff0c;数据量呈现出爆炸式增长&#xff0c;医学数据的复杂性和多样性也达到了前所未有的程度。电子病历系统记录了患者丰富的诊疗信息&#xff0c;医学影像技术如 CT、MRI 等生成海量的图像数据…

STM32与ADS1256多通道数据采样原理及控制程序

好的,使用 STM32 与 ADS1256 通信读取多通道电压是精密数据采集的常见方案。ADS1256 是一款高精度、24 位、8 通道(或差分 4 通道)的 ΔΣ ADC,非常适合需要高分辨率的应用(如传感器信号、医疗仪器等)。 以下是对整个过程的详细分析及基于 STM32 HAL 库的程序示例: 核…

Spring Boot 3.5.x 使用 SpringDoc 2 / Swagger3

这篇文章资料来自于网络&#xff0c;对部分知识整理&#xff0c;这里只是记录一下&#xff0c;仅供参考 为什么要用 Swagger Swagger 的核心思想是通过定义和描述 API 的规范、结构和交互方式&#xff0c;以提高 API 的可读性、可靠性和易用性&#xff0c;同时降低 API 开发的难…

@RefreshScope 核心原理深度解析:Spring Boot 的动态魔法

让我们通过全新的原理图解和代码级分析&#xff0c;揭开RefreshScope实现配置热更新的神秘面纱&#xff01;一、工作原理全景图&#xff08;优化版&#xff09; #mermaid-svg-50lhLlOFeSRIWnLn {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px…

万字详解——OSI七层模型:网络通信的完整架构解析

OSI七层模型&#xff1a;网络通信的完整架构解析OSI&#xff08;Open Systems Interconnection&#xff09;七层模型是计算机网络领域最基础、最权威的参考框架。它由国际标准化组织&#xff08;ISO&#xff09;于1984年提出&#xff0c;旨在为不同厂商、不同技术的网络设备和系…

一个人开发一个App(OpenApi)

为了少写代码&#xff0c;统一前后端的网络层&#xff0c;我使用了OpenApi设计restful接口。然后用openapi-generator来生成flutter的代码。生成go代码用的是oapi-codegen,它对go更友好一些。 我们直接在api.yml中设计接口&#xff0c;所有的返回值与请求者都提取到components里…

光伏气象监测系统:助力光伏发电的智慧大脑

光伏气象监测系统&#xff1a;助力光伏发电的智慧大脑 柏峰【BF-GFQX】在全球积极推动能源转型、大力倡导 “双碳” 目标的当下&#xff0c;光伏发电凭借其清洁、可再生的显著优势&#xff0c;宛如一颗冉冉升起的新星&#xff0c;在能源领域迅速崭露头角&#xff0c;得以广泛推…

SpringCloud01——项目演变、微服务远程调用三种方式、springcloud介绍、nacos注册中心

目录 一、项目架构演变过程 1、单体应用架构 2、垂直应用架构 3、分布式服务架构 4、流动计算架构&#xff08;SOA架构&#xff09; 5、微服务架构 二、如何实现微服务远程调用 1、HttpClient工具类&#xff08;springboot中&#xff09; 形式1&#xff1a;调用第三方…

Oracle 和 MySQL 中的日期类型比较

Oracle 和 MySQL 都提供了多种日期和时间数据类型&#xff0c;但它们在实现和功能上有一些差异。以下是两者的主要日期类型对比&#xff1a;Oracle 日期类型DATE存储日期和时间&#xff08;精确到秒&#xff09;格式&#xff1a;YYYY-MM-DD HH24:MI:SS示例&#xff1a;TO_DATE(…

基于 Redis 实现共享 Session 登录的多种方法与实践

全文目录&#xff1a;开篇语**前言****1. 什么是共享 Session 登录&#xff1f;****2. 基于 Redis 实现共享 Session 的基本方法****2.1 通过 Redis 存储 Session 数据****2.1.1 基本流程****2.1.2 示例代码&#xff08;Java Spring Boot Redis&#xff09;****3. 使用 Redis…

spring cloud + easyRules 零基础搭建智能规则引擎

你是否曾想过在项目中嵌入一套轻量级且高度可扩展的规则引擎&#xff0c;轻松实现动态化的业务决策&#xff1f;在金融、电商、政务等领域&#xff0c;风险控制是业务安全的核心。传统硬编码方式很难应对复杂多变的风控需求&#xff0c;而规则引擎允许我们将这些规则独立出来&a…

AI应用:电路板设计

Diode Computers 公司 Diode Computers是一家专注于利用AI技术进行定制电路板设计和制造的公司&#xff0c;提供从概念到量产的全流程服务。其核心优势在于将电路板设计转化为AI可理解的代码形式&#xff0c;大幅提升设计效率并降低传统EDA工具的使用门槛 0。 核心服务 设计与制…

RocketMQ学习系列之——客户端消息确认机制

一、客户端使用MQ基本代码示例1、添加maven依赖<dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-client</artifactId><version>5.3.0</version> </dependency>2、生产者代码示例public class Produc…