兩個(gè)類,一個(gè)是矩陣對(duì)象類Matrix,另一個(gè)是測(cè)試類MatrixTest

創(chuàng)新互聯(lián)公司基于分布式IDC數(shù)據(jù)中心構(gòu)建的平臺(tái)為眾多戶提供內(nèi)蒙古服務(wù)器托管 四川大帶寬租用 成都機(jī)柜租用 成都服務(wù)器租用。
可以實(shí)現(xiàn)矩陣創(chuàng)建,賦值,轉(zhuǎn)置,加法,支持行列數(shù)不同的矩陣
注1,轉(zhuǎn)置方法將輸出一個(gè)新的矩陣,并不改變?cè)芯仃嚨膬?nèi)容
注2:加法方法是a.add(b),b不發(fā)生變化,a發(fā)生變化,加法將改變a矩陣的內(nèi)容,不會(huì)產(chǎn)生新矩陣
public class Matrix {
private int rows;
private int columns;
private Integer[][] m;
// 行列構(gòu)造法
public Matrix(int rows, int columns) {
this.rows = rows;
this.columns = columns;
this.m = new Integer[rows][columns];
}
// 二維數(shù)組構(gòu)造法
public Matrix(Integer[][] m) {
this.m = m;
this.rows = m.length;
this.columns = m[0].length;
}
// 轉(zhuǎn)置
public Matrix exchange() {
Integer[][] result = new Integer[columns][rows];
for (int i = 0; i rows; i++) {
for (int j = 0; j columns; j++) {
result[j][i] = m[i][j];
}
}
return new Matrix(result);
}
// 加法
public void add(Matrix obj) {
if (obj.getRows() != rows || obj.getColumns() != columns) {
System.out.println("不同行列的矩陣不能相加");
} else {
Integer[][] objarray = obj.toArray();
for (int i = 0; i rows; i++) {
for (int j = 0; j columns; j++) {
m[i][j] += objarray[i][j];
}
}
}
}
// 矩陣賦值
public void setValue(int row, int column, int value) {
if (row rows column columns) {
m[row][column] = value;
} else {
System.out.println("索引超出邊界");
}
}
public int getRows() {
return rows;
}
public int getColumns() {
return columns;
}
public Integer[][] toArray() {
return m;
}
public String toString() {
String result = "";
for (int i = 0; i rows; i++) {
for (int j = 0; j columns; j++) {
result = result + m[i][j] + " ";
}
result += "\r\n";
}
return result;
}
}
public class MatrixTest {
public static void main(String[] args) {
Matrix m1 = new Matrix(2, 3);
for (int i = 0; i 2; i++) {
for (int j = 0; j 3; j++) {
m1.setValue(i, j, i + j);
}
}
System.out.println(m1.toString());
System.out.println(m1.exchange().toString());
Matrix m2 = new Matrix(2, 3);
for (int i = 0; i 2; i++) {
for (int j = 0; j 3; j++) {
m2.setValue(i, j, (i + 1) * (j + 1));
}
}
System.out.println(m2.toString());
m1.add(m2);
System.out.println(m1.toString());
}
}
import?java.math.*;??
import?java.util.*;??
import?java.text.*;??
public?class?matrix?{??
static?int?map1[][]=new?int?[110][110];??
static?int?just[][]=new?int?[110][110];??
public?static?void?printf(int?n,int?map[][])??
{??
int?i,j;??
for(i=1;i=n;i++?)??
{??
for(j=1;jn;j++)??
System.out.print(map[i][j]+"?");??
System.out.println(map[i][j]);??
}??
}??
public?static?void?get(int?numi,int?numj,int?map[][],int?n)??
{??
int?i,j,k,l;??
for(i=0;in+10;i++)??
for(j=0;jn+10;j++)??
just[i][j]=1;??
for(i=1;i=n-1;i++)//求余子式矩陣???
for(j=1;j=n-1;j++)??
{??
if(i=numijnumj)??
just[i][j]=map[i+1][j];??
else?if(i=numij=numj)??
just[i][j]=map[i+1][j+1];??
else?if(inumij=numj)??
just[i][j]=map[i][j+1];??
else?if(inumijnumj)??
just[i][j]=map[i][j];??
}??
}??
//static?int?map[][]=new?int?[110][110];??
public?static?int?getans(int?nn)??
{??
int?map[][]=new?int?[110][110];???
for(int?i=1;i=nn;i++)??
for(int?j=1;j=nn;j++)??
map[i][j]=just[i][j];??
if(nn==2)??
return?map[1][1]*map[2][2]-map[1][2]*map[2][1];??
else?if(nn==1)??
return?map[1][1];??
else??
{??
int?cnb=0;??
for(int?i=1;i=nn;i++)??
{??
get(1,i,map,nn);//得到當(dāng)前余子式?just???
//??printf("pay?attention!\n");??
//print(map,nn);???
//print(just,nn-1);??
if(i%2==1)??
cnb+=map[1][i]*getans(nn-1);??
else??
cnb-=map[1][i]*getans(nn-1);??
}??
return?cnb;??
}??
}??
public?static?int?gcd(int?m,int?n)??
{??
//??????if(mn)??
//??????matrix.gcd(n,m);??
//??????if(n==0)??
//??????return?m;??
//????????
//??????else??
//??????return?matrix.gcd(n,m%n);??
int?mm=m;??
int?nn=n;??
if(mmnn)??
{??
int?c=mm;??
mm=nn;??
nn=c;??
}??
int?w=1;??
while(w!=0)??
{??
w=mm%nn;??
mm=nn;??
nn=w;??
}??
return?mm;??
}??
public?static?void?ans(int?n,int?m)??
{??
if(n*m0)??
{??
System.out.print("-");??
ans(Math.abs(n),Math.abs(m));??
return?;??
}??
if(m==1)??
System.out.print(n+"\t");??
else?if(n%m==0)??
System.out.print(n/m+"\t");??
else??
System.out.print((n/matrix.gcd(m,?n))+"/"+(m/matrix.gcd(m,?n))+"\t");??
}??
public?static?void?main(String[]?args)?{??
//?TODO?自動(dòng)生成的方法存根??
Scanner?cin=new?Scanner(System.in);??
int?i,j,k,l,m,p;??
while(true)??
{??
int?n=cin.nextInt();??
int?ans=0;??
for(i=0;in+10;i++)??
for(j=0;jn+10;j++)??
map1[i][j]=1;??
for(i=1;i=n;i++)??
for(j=1;j=n;j++)??
{??
map1[i][j]=cin.nextInt();??
just[i][j]=map1[i][j];??
}??
int?ans1=matrix.getans(n);??
System.out.println("矩陣的值為:");??
System.out.println(ans1);??
int?map2[][]=new?int?[110][110];??
for(i=1;i=n;i++)??
for(j=1;j=n;j++)??
{??
map2[i][j]=map1[j][i];??
just[i][j]=map2[i][j];??
}??
System.out.println("轉(zhuǎn)置矩陣為:");??
matrix.printf(n,?map2);??
int?help2=matrix.getans(n);??
System.out.println(help2);??
if(help2==0)??
{??
System.out.println("No?inverse?matrix");??
continue;??
}??
System.out.println("逆矩陣為:");??
for(i=1;i=n;i++)??
{??
for(j=1;j=n;j++)??
{??
matrix.get(i,?j,?map2,?n);??
//boolean?b=((i+j)%2==0);??
if((i+j)%2==0)??
matrix.ans(matrix.getans(n-1),?help2);??
else??
matrix.ans(matrix.getans(n-1)*-1,?help2);??
}??
System.out.println();??
}??
System.out.println();??
}??
}??
}
/**
* 求矩陣的逆矩陣 為矩陣右加一個(gè)單位矩陣后進(jìn)行初等行變換,當(dāng)左邊變成單位矩陣時(shí),右邊就是求得的逆矩陣。 矩陣的初等行變換法則
* (1)交換變換:交換兩行 (2)倍法變換:給一行數(shù)據(jù)乘以一個(gè)非0常數(shù) (3)消法變換:把一行所有元素的k倍加到另一行的對(duì)應(yīng)元素上去
* 將上述規(guī)則中的行換成列同樣有效 只有方陣才可能有逆矩陣!
*
* @return
*/
public Matrix inverseMatrix() {
if (!this.isSquareMatrix()) {
System.out.println("不是方陣沒(méi)有逆矩陣!");
return null;
}
// 先在右邊加上一個(gè)單位矩陣。
Matrix tempM = this.appendUnitMatrix();
// 再進(jìn)行初等變換,把左邊部分變成單位矩陣
double[][] tempData = tempM.getMatrixData();
int tempRow = tempData.length;
int tempCol = tempData[0].length;
// 對(duì)角線上數(shù)字為0時(shí),用于交換的行號(hào)
int line = 0;
// 對(duì)角線上數(shù)字的大小
double bs = 0;
// 一個(gè)臨時(shí)變量,用于交換數(shù)字時(shí)做中間結(jié)果用
double swap = 0;
for (int i = 0; i tempRow; i++) {
// 將左邊部分對(duì)角線上的數(shù)據(jù)等于0,與其他行進(jìn)行交換
if (tempData[i][i] == 0) {
if (++line = tempRow) {
System.out.println("此矩陣沒(méi)有逆矩陣!");
return null;
}
for (int j = 0; j tempCol; j++) {
swap = tempData[i][j];
tempData[i][j] = tempData[line][j];
tempData[line][j] = swap;
}
// 當(dāng)前行(第i行)與第line行進(jìn)行交換后,需要重新對(duì)第i行進(jìn)行處理
// 因此,需要將行標(biāo)i減1,因?yàn)樵趂or循環(huán)中會(huì)將i加1。
i--;
// 繼續(xù)第i行處理,此時(shí)第i行的數(shù)據(jù)是原來(lái)第line行的數(shù)據(jù)。
continue;
}
// 將左邊部分矩陣對(duì)角線上的數(shù)據(jù)變成1.0
if (tempData[i][i] != 1) {
bs = tempData[i][i];
for (int j = tempCol - 1; j = 0; j--) {
tempData[i][j] /= bs;
}
// 將左邊部分矩陣變成上對(duì)角矩陣,
// 所謂上對(duì)角矩陣是矩陣的左下角元素全為0
for (int iNow = i + 1; iNow tempRow; iNow++) {
for (int j = tempCol - 1; j = i; j--) {
tempData[iNow][j] -= tempData[i][j] * tempData[iNow][i];
}
}
}
}
// 將左邊部分矩陣從上對(duì)角矩陣變成單位矩陣,即將矩陣的右上角元素也變?yōu)?
for (int i = 0; i tempRow - 1; i++) {
for (int iNow = i; iNow tempRow - 1; iNow++) {
for (int j = tempCol - 1; j = 0; j--) {
tempData[i][j] -= tempData[i][iNow + 1]
* tempData[iNow + 1][j];
}
}
}
// 右邊部分就是它的逆矩陣
Matrix c = null;
int cRow = tempRow;
int cColumn = tempCol / 2;
double[][] cData = new double[cRow][cColumn];
// 將右邊部分的值賦給cData
for (int i = 0; i cRow; i++) {
for (int j = 0; j cColumn; j++) {
cData[i][j] = tempData[i][cColumn + j];
}
}
// 得到逆矩陣,返回
c = new Matrix(cData);
return c;
}
標(biāo)題名稱:逆矩陣java代碼 矩陣求逆編程算法
分享鏈接:http://chinadenli.net/article30/ddodgpo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開發(fā)、面包屑導(dǎo)航、網(wǎng)站維護(hù)、微信小程序、商城網(wǎng)站、動(dòng)態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)