两个类,一个是矩阵对象类Matrix,另一个是测试类MatrixTest
创新互联公司基于分布式IDC数据中心构建的平台为众多户提供内蒙古服务器托管 四川大带宽租用 成都机柜租用 成都服务器租用。
可以实现矩阵创建,赋值,转置,加法,支持行列数不同的矩阵
注1,转置方法将输出一个新的矩阵,并不改变原有矩阵的内容
注2:加法方法是a.add(b),b不发生变化,a发生变化,加法将改变a矩阵的内容,不会产生新矩阵
public class Matrix {
private int rows;
private int columns;
private Integer[][] m;
// 行列构造法
public Matrix(int rows, int columns) {
this.rows = rows;
this.columns = columns;
this.m = new Integer[rows][columns];
}
// 二维数组构造法
public Matrix(Integer[][] m) {
this.m = m;
this.rows = m.length;
this.columns = m[0].length;
}
// 转置
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);//得到当前余子式 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 自动生成的方法存根
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("转置矩阵为:");
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();
}
}
}
/**
* 求矩阵的逆矩阵 为矩阵右加一个单位矩阵后进行初等行变换,当左边变成单位矩阵时,右边就是求得的逆矩阵。 矩阵的初等行变换法则
* (1)交换变换:交换两行 (2)倍法变换:给一行数据乘以一个非0常数 (3)消法变换:把一行所有元素的k倍加到另一行的对应元素上去
* 将上述规则中的行换成列同样有效 只有方阵才可能有逆矩阵!
*
* @return
*/
public Matrix inverseMatrix() {
if (!this.isSquareMatrix()) {
System.out.println("不是方阵没有逆矩阵!");
return null;
}
// 先在右边加上一个单位矩阵。
Matrix tempM = this.appendUnitMatrix();
// 再进行初等变换,把左边部分变成单位矩阵
double[][] tempData = tempM.getMatrixData();
int tempRow = tempData.length;
int tempCol = tempData[0].length;
// 对角线上数字为0时,用于交换的行号
int line = 0;
// 对角线上数字的大小
double bs = 0;
// 一个临时变量,用于交换数字时做中间结果用
double swap = 0;
for (int i = 0; i tempRow; i++) {
// 将左边部分对角线上的数据等于0,与其他行进行交换
if (tempData[i][i] == 0) {
if (++line = tempRow) {
System.out.println("此矩阵没有逆矩阵!");
return null;
}
for (int j = 0; j tempCol; j++) {
swap = tempData[i][j];
tempData[i][j] = tempData[line][j];
tempData[line][j] = swap;
}
// 当前行(第i行)与第line行进行交换后,需要重新对第i行进行处理
// 因此,需要将行标i减1,因为在for循环中会将i加1。
i--;
// 继续第i行处理,此时第i行的数据是原来第line行的数据。
continue;
}
// 将左边部分矩阵对角线上的数据变成1.0
if (tempData[i][i] != 1) {
bs = tempData[i][i];
for (int j = tempCol - 1; j = 0; j--) {
tempData[i][j] /= bs;
}
// 将左边部分矩阵变成上对角矩阵,
// 所谓上对角矩阵是矩阵的左下角元素全为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];
}
}
}
}
// 将左边部分矩阵从上对角矩阵变成单位矩阵,即将矩阵的右上角元素也变为0
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;
}