package com.matrix;
import java.util.Scanner;
import com.myexception.*;
public class Matrix {
public double[][]m;
int lineNum,columnNum;
boolean flag=true;
/**
* 无参数构造方法
*/
public Matrix() {
// TODO Auto-generated constructor stub
}
/**
* 含参数构造方法
*/
public Matrix(double[][]d){
lineNum=d.length;
columnNum=d[0].length;
m=new double[lineNum][columnNum];
for(int i=0;i<lineNum;i++){
for(int j=0;j<columnNum;j++){
m[i][j]=d[i][j];
}
}
}
/**
* 定义一个二维矩阵Matrix(String s,int lineNum,int columnNum)
* 输入字符串,同行元素用“,”隔开,行与行间用“;”隔开,支持分数和小数输入
*/
public Matrix(String s,int lineNum,int columnNum) throws IllegalNumberException,ArraySizeException{
this.lineNum=lineNum;
this.columnNum=columnNum;
m=new double[lineNum][columnNum];
if(s!=null&&!s.equals("")){
String[]line=s.split(";");
if(line.length<=lineNum){
for(int i=0;i<lineNum;i++){
if(i<line.length){
String[]c=line[i].split(",");
if(c.length>columnNum){
//列数超出标定值
flag=false;
throw new ArraySizeException();
}
for(int j=0;j<columnNum;j++){
try{
if(j<c.length)m[i][j]=fractions2decimals(c[j]);
else m[i][j]=0.0;}
catch(NumberFormatException nfe){
throw new IllegalNumberException();
}
}
}
else {
for(int j=0;j<columnNum;j++){
m[i][j]=0.0;
}
}
}
}
else {
//行数超出标定值
flag=false;
throw new ArraySizeException();
}
}
}
/**
* 获取下标为i,j的元素
*/
public double getelement(int i,int j){
return m[i][j];
}
/**
* 设置下表为in,j的元素为某个值
*/
public void setelement(int i,int j,double d){
m[i][j]=d;
}
/**
* 获得矩阵行数
*/
public int getlineNum(){
return lineNum;
}
/**
* 获得矩阵列数
*/
public int getcolumnNum(){
return columnNum;
}
/**
* 获得矩阵实例(返回一个二维数组)
*/
public double[][] getInstance(){
return m;
}
/**
* 打印出矩阵
*/
public void printmatrix(){
if(flag==false)System.out.println("矩阵输入错误!");
else{
for(int i=0;i<lineNum;i++){
for(int j=0;j<columnNum;j++){
System.out.print(m[i][j]+"\t");
}
System.out.println();
}
}
}
/**
* 矩阵相乘
*/
public static double[][] multiple(double[][] a,double[][] b)throws MatrixCanNotMultipleException{
if(a[0].length!=b.length)throw new MatrixCanNotMultipleException();
else{
double c[][] = new double[a.length][b[0].length];
int x,i,j;
for(i = 0;i<a.length ;i++)
{
for(j = 0;j<b[0].length;j++)
{
double temp = 0;
for(x = 0;x<b.length;x++)
{
temp+=a[i][x]*b[x][j];
}
c[i][j] = temp;
}
}
return c; }
}
/**
* 矩阵转置
*/
public static double[][] transformMatrix(double[][]d){
double[][]t=new double[d[0].length][d.length];
for(int i=0;i<d.length;i++){
for(int j=0;j<d[0].length;j++){
t[j][i]=d[i][j];
}
}
return t;
}
/**
* 将含有“/”的分数转化为小数
*/
public static double fractions2decimals(String fractions)throws IllegalNumberException{
double d=0.0,d1=0,d2=1;
try{
if(!fractions.contains("/"))
d= Double.parseDouble(fractions);
else{
String []s=fractions.split("/");
if(s.length rel='nofollow' onclick='return false;'>2){
throw new IllegalNumberException();
}
d1=Double.parseDouble(s[0]);
d2=Double.parseDouble(s[1]);
d=d1/d2;}
}
catch(NumberFormatException nfe){
throw new IllegalNumberException();
}
return d;
}
/*
* 主函数
*/
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
while(true){
try{
System.out.println("请输入矩阵一");
String s1=scan.next();
System.out.println("请输入行数");
int li1=Integer.parseInt(scan.next());
System.out.println("请输入列数");
int co1=Integer.parseInt(scan.next());
Matrix matrix1=new Matrix(s1, li1, co1);
matrix1.printmatrix();
System.out.println("请输入矩阵二");
String s2=scan.next();
System.out.println("请输入行数");
int li2=Integer.parseInt(scan.next());
System.out.println("请输入列数");
int co2=Integer.parseInt(scan.next());
Matrix matrix2=new Matrix(s2, li2, co2);
matrix2.printmatrix();
Matrix matrix3=new Matrix(Matrix.multiple(matrix1.getInstance(), matrix2.getInstance()));
System.out.println("两矩阵相乘得:");
matrix3.printmatrix();
Matrix matrix4=new Matrix(Matrix.transformMatrix(matrix3.getInstance()));
System.out.println("转置后为:");
matrix4.printmatrix();}
catch(MatrixCanNotMultipleException mcnme){
System.out.println(mcnme);
}
catch(ArraySizeException ase){
System.out.println(ase);
}
catch(IllegalNumberException ine){
System.out.println(ine);
}
}
}
}