Java?超詳細(xì)帶你掌握矩陣的運(yùn)算
在我們計(jì)算機(jī)江湖中一直流傳著這樣一句話:矩陣是無所不能的。我們在熒幕中所看到的二維三維圖形的移動變換,放大縮小,任由我們的“擺布”,可是你知道這些變換是如何在計(jì)算機(jī)中實(shí)現(xiàn)的嗎?在這一章耀楊帶著兄弟萌初步了解這無所不能的矩陣,也為了破掉這層矩陣找到佳慧?。?!
1.物體的坐標(biāo)變換
咱們直接進(jìn)入正題,計(jì)算機(jī)中我們鎖看到的物體移動無疑例外設(shè)計(jì)到坐標(biāo)變換,平移,旋轉(zhuǎn),縮放這些都伴隨著坐標(biāo)的變換。
計(jì)算機(jī)會根據(jù)物體在計(jì)算機(jī)中的位置以及我們的位置分別對物體的各個(gè)定點(diǎn)進(jìn)行一系列的坐標(biāo)運(yùn)算,最后投影到屏幕上被我們所看到二維圖像。
計(jì)算機(jī)中的圖形不可能想現(xiàn)實(shí)中可以用“力”來實(shí)現(xiàn),那么計(jì)算機(jī)是怎么移動這些物體的呢?這些坐標(biāo)自然有了作用。
1.1平移:
x’=x+tx
y’=y+ty
由于在計(jì)算機(jī)中對物體進(jìn)行頂點(diǎn)之間的操作過去繁瑣,在對多物體操作的時(shí)候用矩陣的乘法進(jìn)行運(yùn)算不僅大大提高了效率,也方便了物體進(jìn)行連續(xù)的變換。
加法轉(zhuǎn)變成矩陣相乘比較有意思~由于加法中涉及到常量tx和ty所以無法直接通過2*2矩陣進(jìn)行變換,在這里給兄弟萌講解一個(gè)技巧——齊次坐標(biāo),這種給矩陣添加一個(gè)維度的技巧在矩陣運(yùn)算中經(jīng)常用到,還可以通過其次坐標(biāo)進(jìn)行矩陣的除法運(yùn)算。

1.2縮放:
x’=Sx * x
y’=Sy * y

1.3旋轉(zhuǎn):

如圖:可得出旋轉(zhuǎn)后的坐標(biāo)為:(通過正弦公式和余弦公式)
x’=xcosθ-ysinθ
y’=xsinθ+ycosθ
通過這個(gè)結(jié)果我們推導(dǎo)到矩陣計(jì)算是:

??根據(jù)這樣的定義,我們就可以推導(dǎo)二維空間中的任意變換都可以用一個(gè)3 * 3 矩陣來表示。
??同理,在三維空間中的任意變換我們可以用一個(gè)4 * 4 矩陣來表示。
??在4 * 4矩陣中還可以實(shí)現(xiàn)三維物體的透視投影,憑借齊次坐標(biāo)實(shí)現(xiàn)矩陣的除法等等。
當(dāng)然了關(guān)于矩陣還有很多更深入的知識等著大家探索,為師之后也會給大家持續(xù)教學(xué)!
1.4矩陣乘法

加減法為師就不介紹了,想必兄弟萌也都明白。
2.java實(shí)現(xiàn)矩陣的相關(guān)運(yùn)算
2.1創(chuàng)建矩陣:
public int[][] createMatric(int row,int colum){
@SuppressWarnings("resource")
Scanner input=new Scanner(System.in);
int array[][]=new int[row][colum];
for(int i=0;i<array.length;i++)
for(int j=0;j<array[i].length;j++){
array[i][j]=input.nextInt();
}
return array;
}
2.2矩陣加法:
public int[][] matricAdd(int matric1[][],int matric2[][] ){
int matric3[][]=new int[matric1.length][matric1[0].length];
if(matric1.length!=matric2.length||matric1[0].length!=matric2[0].length){
System.out.println("輸入格式有誤");
System.exit(0);
}else{
for(int i=0;i<matric1.length;i++)
for(int j=0;j<matric1[0].length;j++)
matric3[i][j]=matric1[i][j]+matric2[i][j];
}
return matric3;
}
2.3矩陣減法:
public int[][] matricJian(int matric1[][],int matric2[][] ){
int matric3[][]=new int[matric1.length][matric1[0].length];
if(matric1.length!=matric2.length||matric1[0].length!=matric2[0].length){
System.out.println("輸入格式有誤");
System.exit(0);
}else{
for(int i=0;i<matric1.length;i++)
for(int j=0;j<matric1[0].length;j++){
matric3[i][j]=matric1[i][j]-matric2[i][j];
}
}
return matric3;
}
2.4矩陣乘法:
public int[][] matricCheng(int matric1[][],int matric2[][]){
int matric3[][]=new int[matric1.length][matric1[0].length];
if(matric1.length!=matric2[0].length||matric1[0].length!=matric2.length){
System.out.println("輸入格式有誤");
System.exit(0);//退出虛擬機(jī)
}else {
for(int i=0;i<matric1.length;i++)
for(int j=0;j<matric2[0].length;j++)
for(int k=0;k<matric2.length;k++)
matric3[i][j]+=matric1[i][k]*matric2[k][j];
}
return matric3;
}
2.5矩陣的轉(zhuǎn)置
public int[][] matricReserve(int matric[][]){
int matric3[][]=new int[matric[0].length][matric.length];
for(int i=0;i<matric.length;i++) {
for(int j=0;j<matric[0].length;j++) {
matric3[j][i]=matric[i][j];
}
}
return matric3;
}
2.6矩陣和數(shù)字相乘
public int[][] matricShuCheng(int matric[][],int x){
for(int i=0;i<matric.length;i++)
for(int j=0;j<matric[0].length;j++) {
matric[i][j]=matric[i][j]*x;
}
return matric;
}
2.7矩陣的輸出
public void inputMatric(int matric[][]) {
System.out.println("運(yùn)算結(jié)果為:");
for(int i=0;i<matric.length;i++) {
for(int j=0;j<matric[0].length;j++) {
System.out.print(matric[i][j]+" ");
}
System.out.println("");
}
}
到此這篇關(guān)于Java 超詳細(xì)帶你掌握矩陣的運(yùn)算的文章就介紹到這了,更多相關(guān)Java 矩陣內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java利用IO流實(shí)現(xiàn)簡易的記事本功能
本文將利用Java中IO流編寫一個(gè)模擬日記本的程序,通過在控制臺輸入指令,實(shí)現(xiàn)在本地新建文件,打開日記本和修改日記本等功能,感興趣的可以了解一下2022-05-05
spring依賴注入成功但在調(diào)用接口的時(shí)候拿到的依賴卻是null問題
這篇文章主要介紹了spring依賴注入成功但在調(diào)用接口的時(shí)候拿到的依賴卻是null問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12
Presto自定義函數(shù)@SqlNullable引發(fā)問題詳解
這篇文章主要為大家介紹了Presto自定義函數(shù)@SqlNullable引發(fā)問題詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
SpringBoot Swagger2 接口規(guī)范示例詳解
Swagger(在谷歌、IBM、微軟等公司的支持下)做了一個(gè)公共的文檔風(fēng)格來填補(bǔ)上述問題,在本文中,我們將會學(xué)習(xí)怎么使用Swagger的 Swagger2注解去生成REST API文檔,感興趣的朋友一起看看吧2023-12-12
Maven項(xiàng)目如何查找jar包是由哪個(gè)依賴引入的
這篇文章主要介紹了Maven項(xiàng)目如何查找jar包是由哪個(gè)依賴引入的問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08
Java實(shí)現(xiàn)ModbusTCP通信功能
使用ModbusTCP實(shí)現(xiàn)和硬件設(shè)備通信功能,本文通過實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2021-08-08

