T001-UT001-0023

矩阵运算练习——矩阵乘法


编写一个程序,从标准输入设备上输入两个实数矩阵,第一个矩阵为A,第二个矩阵为B,计算A*B*A的积,输出结果中的实数保留两位小数。 若出现矩阵格式错误或违反了矩阵计算规则的情况,则输出Error Input

   合法的矩阵采用如下格式的字符串描述:

1 x 1的矩阵: [1.00]
1 x 3的矩阵: [1.00 1.00 1.00]
3 x 1的矩阵: [1.00;1.00;1.00]
3 x 3的矩阵: [1 1 1;1 1 1;1 1 1]

非法矩阵举例:

[a]
[1.0a 1.00 1.00]
[1.00 2;1.00;1.00]
[1 1 1 1;1 1;1 1 1]

举例一:

输入:

1
2
3
4
matrix a:
[1 1 1;1 1 1;1 1 1]
matrix b:
[1 1 1;1 1 1;1 1 1]

输出:

1
2
a*b*a:
[9.00 9.00 9.00;9.00 9.00 9.00;9.00 9.00 9.00]

举例二:

输入:

1
2
3
4
matrix a:
[1 1 a;1 1 1;1 1 1]
matrix b:
[2 2 2;2 2 2;2 2 2]

输出:

1
Error Input    

举例三:

输入:

1
2
3
4
matrix a:
[1 1]
matrix b:
[2 2 2;2 2 2;2 2 2]

输出:

1
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("]");
			}
		}
	}
}


(全文完)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值