DAY31 整數矩陣及其運算

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…