矩阵运算练习——矩阵乘法
编写一个程序,从标准输入设备上输入两个实数矩阵,第一个矩阵为A,第二个矩阵为B,计算A*B*A的积,输出结果中的实数保留两位小数。 若出现矩阵格式错误或违反了矩阵计算规则的情况,则输出Error Input
合法的矩阵采用如下格式的字符串描述:
非法矩阵举例:
举例一:
输入:
输出:
举例二:
输入:
输出:
举例三:
输入:
输出:
代码如下:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.DecimalFormat;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class D0023 {
public static void main(String[] args) {
//以字符串接收
String[] s=new String[2];
InputStreamReader ir = new InputStreamReader(System.in);
BufferedReader in = new BufferedReader(ir);
try {
int n=2,i=0;
while (n-->0) {
System.out.println("matrix "+(char)(i+97)+":");
s[i++]= in.readLine();
//System.out.println("Read: " + s[i-1]);
}
in.close();
} catch (IOException e) {
e.printStackTrace();
}
//处理字符串输出结果
Dispose(s);
}
public static void Dispose(String []s){//判断矩阵是否非法并且存贮矩阵
//先对字符串进行截取,以字符串判断矩阵的函数以及列数,并且放入一个二维矩阵中去
//截取成单个字符
String regex="\\[|\\]|\\;| ";
String regex1="[a-zA-Z]";
int row=1,line=1,flag=0;//行列记录
char[] str1=s[0].toCharArray();
//以字符串判断矩阵的函数以及列数
for(int i=0;i<str1.length;i++){
if(str1[i]==' '&&flag==0)line++;
if(str1[i]==';'){
flag=1;row++;
}
}
//切割字符串,提取出纯数字字符
String[] slist1= s[0].split(regex);
String[] slist2= s[1].split(regex);
//判断矩阵维数是否相等
if(slist1.length!=slist2.length){
System.out.print("Error Input");
return;
}
//判断矩阵里是否有字母
Matcher m1=Pattern.compile(regex1).matcher(s[0]);
Matcher m2=Pattern.compile(regex1).matcher(s[1]);
if(m1.find()||m2.find()){
System.out.print("Error Input");
return;
}
//创建两个二维数组存贮
double[][] nu1=new double[row][line];
double[][] nu2=new double[line][row];
//把一维数组放入矩阵(二维数组)中
int index=1;
for(int i=0;i<row;i++){
for(int j=0;j<line;j++){
nu1[i][j]=Double.parseDouble(slist1[index]);//将string转换成double
index++;
}
}
index=1;
for(int i=0;i<line;i++){
for(int j=0;j<row;j++){
//将string转换成double
nu2[i][j]=Double.parseDouble(slist2[index]);
index++;
}
}
//矩阵相乘
Count(nu1,nu2,row,line);
}
public static void Count(double [][]nu1,double [][]nu2,int row,int line){//矩阵相乘
//矩阵相乘,输出矩阵
double[][] result=new double[nu1.length][nu2[0].length];
System.out.println("a+b:");
for(int i=0;i<nu1.length;i++){
for(int j=0;j<nu2[0].length;j++){
result[i][j]=0;
for(int k=0;k<nu2.length;k++)
result[i][j]+=nu1[i][k]*nu2[k][j];
}
}
double[][] re=new double[result.length][nu1[0].length];
for(int i=0;i<result.length;i++){
for(int j=0;j<nu1[0].length;j++){
re[i][j]=0;
if(j==0&&i==0)System.out.print("[");
for(int k=0;k<nu1.length;k++)
re[i][j]+=result[i][k]*nu1[k][j];
DecimalFormat dg=new DecimalFormat("0.00"); //保留两位小数
String strnum2=dg.format(re[i][j]);
System.out.print(strnum2);
if(j==nu1[0].length-1&&i!=result.length-1)System.out.print(";");
else if(j!=nu1[0].length-1){
System.out.print(" ");
}
if(i==result.length-1&&j==nu1[0].length-1)System.out.print("]");
}
}
}
}
(全文完)