數據結構和算法Java實現矩陣

相信朋友們對矩陣應該不陌生,它貫穿了幾乎所有計算機應用數學的所有課程。矩陣是高等代數學中的常見工具,也常見於統計分析等應用數學學科中。下面我們簡單複習下。

什麼是矩陣

1.矩陣定義

在數學中,矩陣(Matrix)是一個按照長方陣列排列的實數或複數的集合,最早來自於方程組的係數及常數所構成的方陣。

由 m × n 個數aij排成的m行n列的數表稱為m行n列的矩陣,簡稱m × n矩陣。記作:

數據結構和算法Java實現矩陣

這m×n 個數稱為矩陣A的元素,簡稱為元,數aij位於矩陣A的第i行第j列,稱為矩陣A的(i,j)元,以數 aij為(i,j)元的矩陣可記為(aij)或(aij)m × n,m×n矩陣A也記作Amn。而行和列都為n的矩陣我們稱為n階方陣。

2.對稱矩陣

如果n階矩陣中的元素滿足: aij = aji ( i 為行標, j 為列標),就稱這個矩陣為對稱矩陣。

數據結構和算法Java實現矩陣

圖1 為 3 階對稱矩陣,圖中的虛線為矩陣的 “主對角線” ,主對角線上方區域稱為 “上三角” ;主對角線下方稱為 “下三角” ,沿主對角線對稱的數據元素一一相等。

3.上下三角矩陣

上下三角矩陣,和對稱矩陣類似,不同在於,上三角矩陣是指主對角線下方的元素(不包括主對角線上的)都是常數C(包括數值 0 );同理,下三角矩陣是指主對角線上方的元素都是常數C。

數據結構和算法Java實現矩陣

矩陣運算

1.矩陣轉置

矩陣的轉置實際上就是將數據元素的行標和列標互換,即 T(i,j) = M(j,i) 。例如:

數據結構和算法Java實現矩陣

矩陣的轉置,經歷了三個步驟:

(1)矩陣的行數 n 和列數 m 的值交換;

(2)將數組中的i和j調換;

(3)轉換之後的表同樣按照行序(置換前的列序)為主序,進行排序;

2.矩陣加法

矩陣之間能夠進行加法運算的前提條件是:各矩陣的行數和列數必須相等。矩陣相加的結果就是矩陣中對應位置的值相加所組成的矩陣,例如:

數據結構和算法Java實現矩陣

3.矩陣乘法

矩陣相乘的前提條件是:

(1)當矩陣A的列數等於矩陣B的行數時,A與B可以相乘,且矩陣的乘法運算沒有交換律,即 A*B 和 B*A 是不一樣的。。

(2)矩陣C的行數等於矩陣A的行數,C的列數等於B的列數。

(3)乘積C的第m行第n列的元素等於矩陣A的第m行的元素與矩陣B的第n列對應元素乘積之和。

如下所示:

數據結構和算法Java實現矩陣

矩陣基本運算封裝

上面我們瞭解了矩陣的幾個基本概念和運算,下面我將用Java的類封裝來實現一個矩陣的基本運算。

public class Matrix {

private int[][] matrix;//矩陣數組容器

public Matrix(int rowNum,int colNum){

this.matrix=new int[rowNum][colNum];

}

public Matrix(int [][] arr){

this.matrix=arr;

}

//設置第row行第col列的值

public void set(int row,int col,int val){

this.matrix[row][col]=val;

}

//獲取第row行第col列的值

public int get(int row,int col){

return this.matrix[row][col];

}

//數組轉置

public Matrix transpose(){

int listNum = this.matrix[0].length; //列數

int lineNum = this.matrix.length; //行數

int [][] matrix = new int [listNum][lineNum];//構建轉置後的數組

for (int i = 0; i < lineNum; i++) {

for (int j = 0; j < listNum; j++) {

matrix[j][i] = this.matrix[i][j];

}

}

return new Matrix(matrix);

}

//判斷矩陣是上三角矩陣

public boolean isUpperTriangularMatrix() {

for(int i=1;i<this.matrix.length>

for(int j=0;j

if(this.matrix[i][j] !=0){

return false;

}

}

}

return true;

}

//判斷一個矩陣是否為下三角矩陣

public boolean isLowerTriangularMatrix(){

for(int i=0; i<this.matrix.length-1>

for(int j=i+1; j<this.matrix>

if(this.matrix[i][j] != 0){

return false;

}

}

}

return true;

}

//判斷一個矩陣是否為對稱矩陣

public boolean isSymmetricMatrix() {

int i,j;

for(i=1;i<this.matrix.length>

for(j=0;j

if(this.matrix[i][j] != this.matrix[j][i]){

return false;

}

}

}

return true;

}

//矩陣加法

public Matrix plus(Matrix obj){

int[][] result = new int[obj.matrix.length][obj.matrix[0].length];

for(int i = 0; i < obj.matrix.length; i++){

for(int j = 0; j < obj.matrix[0].length; j++){

result[i][j] = this.matrix[i][j] + obj.matrix[i][j];

}

}

return new Matrix(result);

}

//矩陣相乘

public Matrix multiplict(Matrix obj){

int[][] result= new int[this.matrix.length][obj.matrix.[0].length];

for(int i = 0; i < this.matrix.length; i++){

for(int j = 0;j < obj.matrix.[0].length; j++){

result[i][j] = this.calculateSingleResult(this.matrix, obj.matrix, i, j);

}

}

return new Matrix(result);

}

/**

* 矩陣乘法a中result每個元素的單一運算

* @param matrix_a 矩陣a

* @param matrix_b 矩陣b

* @param row 參與單一運算的行標

* @param col 參與單一運算的列標

* @return result 運算結果

*/

private int calculateSingleResult(int[][] matrix_a, int[][] matrix_b, int row, int col){

int result = 0;

for(int i = 0; i < matrix_a[0].length; i++){

result += matrix_a[row][i] * matrix_b[i][col];

}

return result;

}

// 將矩陣輸出

public void output() {

for (int i = 0; i < this.matrix.length; i++) {

for (int j = 0; j < this.matrix[i].length; j++) {

System.out.print(this.matrix[i][j] + "\t") ;

}

System.out.println() ;

}

}

}

上面的Matrix類就是一個簡單的矩陣操作類,這裡只是作為一個參考實例,有些邏輯不是很嚴格,需要的可以自行修改。關注、轉發、評論頭條號每天分享java 知識,私信回覆“555”贈送一些Dubbo、Redis、Netty、zookeeper、Spring cloud、分佈式資料

/<this.matrix.length>

/<this.matrix>

/<this.matrix.length-1>

/<this.matrix.length>


分享到:


相關文章: