矩陣的旋轉和相加——數組實現

2020-12-13 程序釀造師

1.矩陣

在數學中,矩陣是一個矩形陣列排列的複數和實數集合。是高等代數中常見的工具。在計算機科學中,一些數值分析、動畫製作、遊戲等方面就會用到矩陣。在程式語言中矩陣可以用一個二維數組進行模擬,如下圖所示:

矩陣和二維數組

大多數高級語言中,都支持二維數組,用二維數組來實現矩陣是非常容易的,程式語言更多的是用來模擬矩陣的加減操作以及移動操作。

2.矩陣的操作

在一些遊戲設計中,經常會用到矩陣進行操作,例如加減操作和旋轉操作就是使用頻率較多的操作。下面我們列舉幾個常見的矩陣操作:

2.1 矩陣相加

一般情況下,兩個矩陣相加,需要兩個矩陣擁有相同的大小(如下圖所示):

矩陣相加

如果在計算機中進行模擬矩陣的相加,相當於兩個同等規模的二維數組相加,並進行同行同列的元素相加。相加後得到的矩陣依然是一個同等規模的矩陣數組。這個操作在程式語言中操作是非常簡單的。

2.2 矩陣錯位相加

矩陣錯位相加時,可以讓兩個不同規模的矩陣相加,這個模式的相加方式,只對兩個矩陣重合的部分進行相加(如下圖所示)。

矩陣錯位相加

2.3 矩陣旋轉

矩陣旋轉需要矩陣是一個規則矩陣(矩陣的長和寬相等,否則旋時丟失數據),矩陣的旋轉轉角為90度的倍數(如下圖所示)。

矩陣旋轉

矩陣的旋轉在遊戲中的應用非常廣泛,例如我們熟悉的俄羅斯方塊中,就會用到矩陣的旋轉。

3.Java程序模擬矩陣

在Java中,模擬矩陣需要創建一個行列平衡的二維數組(要求每行的元素個數都一樣)。如果要進行旋轉,必須要求二維數組的行列一致。我們可以定義類Matrix進行矩陣的模擬,它需要包含一個二維數組,以及表示二維數組的行列整型值。Matrix類的聲明及構造方法如下所示:

3.1 矩陣添加元素操作

為了給矩陣增加數據添加的入口,我們可以在Matrix類中增加矩陣添加數據的操作(整體矩陣隨機添加元素、按行和列添加元素),以及一個列印矩陣的方法,這些方法如下所示:

這裡要注意方法setforEach中的Function<V,R>參數,它是一個函數式接口。它的目的在於讓開發者自己定義數據的計算規則。泛型V是函數方法apply中的參數,泛型R是apply方法的返回類型。在setforEach方法內,我們將矩陣元素作為參數傳遞到apply方法中。在方法setRandomMatr中,我們就利用setforEach進行了隨機數添加,但是我們沒有使用矩陣中的元素。

這幾個方法在添加到Matrix類中後,我們可以在main方法中進行一些測試(測試內容和結果如下所示):

3.2 矩陣相加操作

矩陣的第二個功能是完成矩陣的相加和錯位相加,這兩種相加方式可以通過參數來完成。進行錯位相加時,要判斷數組中的元素是否出界。在Matrix類中,添加add方法用於進行矩陣的相加和錯位相加(如下所示)。

進行矩陣相加時,要有一個基礎矩陣作為被加矩陣,被加矩陣默認為當前矩陣。進行矩陣相加時,允許偏移量小於0。下面為矩陣相加功能的測試結果:

3.3 矩陣旋轉操作

矩陣的旋轉是矩陣操作中稍微複雜一點的操作,如果找到規律後,矩陣的旋轉也不是難事。矩陣旋轉的前提條件是必須保證矩陣是一個長寬相等的正方形矩陣。其次旋轉時只能以90°的倍數進行旋轉(向左或向右):

矩陣旋轉規則

上圖中左側為順時針旋轉90°時的算法。每一種顏色表示要旋轉的圈數。當矩陣的長度為基數或者偶數的時候,旋轉的圈數都可以記為n/2(n為矩陣長度)。

以上圖左側為例,當矩陣旋轉時,每旋轉一個矩陣元素時,要同時涉及到四個矩陣元素同時旋轉進行數據交換(左圖各顏色線條所標識),這四個元素之間的關係如下圖所示:

矩陣旋轉中元素之間的關係

在旋轉操作上,我們實際上只要操作上圖6中白色標記的元素,即可完成所有元素的旋轉。如果在雙層循環中完成旋轉操作,外層只要遍歷矩陣的深度的一半,即i<row/2,內層j起始應以i為起點開始遍歷,到row-i-1結束。在編寫矩陣旋轉方法時,我們可以添加右旋轉、左旋轉、以及多倍90度角旋轉(實現代碼如下)。

如果旋轉的角度不是90°的整數倍,我們按照除以90取整的方式進行,並計算出旋轉的角度是90,180還是270度。如果角度為負數,則說明是相反方向旋轉。在leftRotate和rightRotate中都滿足了上述兩種情景的判斷。上述方法測試情況如下:

如果我們想設計一個俄羅斯方塊的遊戲,就可以用到數組實現矩陣的一些功能。在以後的內容中,我們會進行講述。

相關焦點

  • 【ADAMS】矩陣/數組函數
    矩陣/數組函數可很方便地完成針對矩陣/數組的操作。(1)矩陣/數組的基本操作函數ALIGN 將數組轉換到從特定值開始ALLM 返回矩陣元素的邏輯值ANGLES 將方向餘弦矩陣轉換為指定旋轉順序下的角度矩陣ATAN(x) 數字表達式x 的反正切值ATAN2(x1,x2) 兩個數字表達式x1,x2 的四象限反正切值(3)取整函數INT(x)
  • 數組數據的輸出與相加(PHP代碼)
    學習數組的知識數組相關一維數組輸出與其數據相加一維數組的輸出與結果相加二維數組輸出與其數據相加二維數組的輸出與結果相加解釋:數組的輸出使用了print_f()函數,二維數組為了方便觀看使用了格式化處理30、32行,輸出函數的格式在代碼第
  • MATLAB-3-數組和矩陣
    1、簡介本文介紹了MATLAB數組和矩陣,軟體工程師在搭建模型時可參照。
  • LeetCode 系列-數組和矩陣
    面試中如果暫時想不出題解,一定要嘗試使用暴力解法得到答案題目摘要41 First Missing PositiveLeetCode/力扣給你一個未排序的整數數組 nums ,請你找出其中沒有出現的最小的正整數。
  • matlab官方快速入門----矩陣和數組
    MATLAB®主要用於處理整個的矩陣和數組,而其他程式語言大多逐個處理數值,所有 MATLAB 變量都是多維數組,與數據類型無關。矩陣是指通常用來進行線性代數運算的二維數組。數組創建要創建每行包含四個元素的數組,請使用逗號 (,) 或空格分隔各元素。
  • 【LeetCode】數組--旋轉數組(189)
    】數組(Array)是一種線性表數據結構。】匯總貼(NO.1-20)今日題目給定一個數組,將數組中的元素向右移動 k 個位置,其中 k 是非負數。示例 1:輸入: [1,2,3,4,5,6,7] 和 k = 3輸出: [5,6,7,1,2,3,4]解釋:向右旋轉 1 步: [7,1,2,3,4,5,6]向右旋轉 2 步: [6,7,1,2,3,4,5]向右旋轉 3 步: [5,6,7,1,2,3,4]示例 2:
  • 資源 | 從數組到矩陣的跡,NumPy常見使用大總結
    此外,因為機器學習存在著大量的矩陣運算,所以 NumPy 允許我們在 Python 上實現高效的模型。NumPy 是 Python 語言的一個擴充程序庫。支持高效的多數組與矩陣運算,此外也針對數組運算提供大量的數學函數庫。NumPy 的科學計算十分高效,因此彌補了 Python 在運算效率上的不足。
  • 一起刷 leetcode 之旋轉矩陣(頭條/華為/陌陌真題)
    6, 8, 9],  [16, 7,10,11]]分析方法 1:藉助額外數組存放旋轉後的元素按行旋轉,找旋轉前和旋轉後元素的坐標對應關係原始矩陣1 2 34 5 67 8 9把第一行順時針旋轉 90 度後為:x x 1x x 2x x 3
  • 向量、矩陣的介紹和運算
    可以這麼解釋兩個向量相加。在下面這張圖中,有兩個向量 x 和 y,它們的長度分別是 x』和 y』,它們的相加結果是 x+y,這個結果所對應的點相當於 x 向量沿著 y 向量的方向移動 y』,或者是 y 向量沿著 x 向量的方向移動 x』。
  • 圖解NumPy,這是理解數組最形象的一份教程了
    我們將下圖兩個數組稱為 data 和 ones:將它們按位置相加(即每行對應相加),直接輸入 data + ones 即可:當我開始學習這些工具時,我發現這樣的抽象讓我不必在循環中編寫類似計算。此類抽象可以使我在更高層面上思考問題。
  • 圖解 NumPy,這是理解數組最形象的一份教程了
    將它們按位置相加(即每行對應相加),直接輸入 data + ones 即可:>算術運算和矩陣運算的一個關鍵區別是矩陣乘法使用點乘。轉置和重塑處理矩陣時的一個常見需求是旋轉矩陣。當需要對兩個矩陣執行點乘運算並對齊它們共享的維度時,通常需要進行轉置。
  • MATLAB矩陣與數組
    MATLAB既然以矩陣實驗室命名,就說明該軟體在矩陣計算方面具有非常優異的表現。在MATLAB中,一般情況下一個矩陣就是指一個長方形的數組。特殊情況有兩個,一是單一元素的標量,二是只有一行或者一列的矩陣,也就是向量。MATLAB也有其他儲存數值和非數值數據的方式,但是對於初學者來說,最好是將所有的情況都考慮為矩陣,這樣更容易使用。
  • 教程| 基礎入門:深度學習矩陣運算的概念和代碼實現
    如在使用批量梯度下降迭代求最優解時,正規方程會採用更簡潔的矩陣形式提供權重的解析解法。而如果不了解矩陣的運算法則及意義,甚至我們都很難去理解一些如矩陣因子分解法和反向傳播算法之類的基本概念。同時由於特徵和權重都以向量儲存,那如果我們不了解矩陣運算,代碼實現將變得十分艱難。什麼是線性代數?
  • 教程 | 基礎入門:深度學習矩陣運算的概念和代碼實現
    在我們學習機器學習時,常常遇到需要使用矩陣提高計算效率的時候。如在使用批量梯度下降迭代求最優解時,正規方程會採用更簡潔的矩陣形式提供權重的解析解法。而如果不了解矩陣的運算法則及意義,甚至我們都很難去理解一些如矩陣因子分解法和反向傳播算法之類的基本概念。同時由於特徵和權重都以向量儲存,那如果我們不了解矩陣運算,代碼實現將變得十分艱難。
  • LeetCode刷題指南(數組和矩陣)
    LeetCode題解,於是我結合自己在進行刷題時做的分析和理解,按照題目類型進行劃分,形成本系列的LeetCode刷題指南。本文主要介紹的是LeetCode題庫中與數組和矩陣相關的經典題目,提供了LeetCode原題題號,參考答案,以及題目的部分解析。數組和矩陣把數組中的 0 移到末尾283.
  • 詳解Python中的算術乘法、數組乘法與矩陣乘法
    5.1.1  內置函數open()655.1.2  文件對象常用方法665.1.3  上下文管理語句with665.2  JSON文件操作675.3  CSV文件操作675.4  Word、Excel、PowerPoint文件操作實戰68本章知識要點70本章習題71第6章 numpy數組與矩陣運算
  • 如何求二維數組的前綴和?
    題目描述:有一個長度為 N 的整數數組 A,要求返回一個新的數組 B,其中 B 的第 i 個數 B[i]是「原數組 A 前 i 項和」。這道題實際就是讓你求數組 A 的前綴和。對 [1,2,3,4,5,6] 來說,其前綴和可以是 pre=[1,3,6,10,15,21]。
  • 商學院 零基礎學習風險建模【2】EXCEL秒算矩陣
    其按照行、列的方式組織在一起,和Excel中表格的元素組織方式是一致的, 因此Excel中的數組函數支持矩陣計算,包括加(+),減(-),乘(MMULT),轉置(TRANSPOSE),行列式(MDETEM),逆(MINVERSE)。重要的事情說三遍:在Excel 中數組函數輸入結束後需要按ctrl+shift+enter!
  • 斐波那契數列與矩陣乘法的聯繫以及其python實現
    避免重複 的關鍵在於 要實現檢查即將進行的計算是否已經經歷過。有同學會想到使用列表,每計算一個feb(n),就將結果存儲到列表的下標n 處。本身斐波那契數列 中 第n個就是 前兩個數相加的和。只需要一直更新   feb(n-1)   和  feb(n-2)  的值即可。
  • R 矩陣
    R 語言為線性代數的研究提供了矩陣類型,這種數據結構很類似於其它語言中的二維數組,但 R 提供了語言級的矩陣運算支持。