package com.ql.until.huigui;
import java.util.Date;
import java.util.Scanner;
import javax.swing.JOptionPane;
import Jama.*;
/*
二元线性回归
y=a+bx1+cx2
x1=拥有钱
x2=人数
y=消费的钱
*/
public class multiMetrix {
//矩阵相乘方法
public static void multiMetrixAandB(int metrixA[][] , int metrixB[][]){
int result[][] = new int[metrixA.length][metrixB[0].length];
int x,i,j,tmp=0;
for(i =0;i<metrixA.length;i++){
for(j = 0;j<metrixB[0].length;j++){
for( x=0;x<metrixB.length;x++)
tmp += metrixA[i][x] * metrixB[x][j];//矩阵AB中a_ij的值等于矩阵A的i行和矩阵B的j列的乘积之和
result[i][j] = tmp;
tmp = 0; //中间变量,每次使用后都得清零
}
}
//打印计算后的矩阵
System.out.println("\n"+"矩阵A*B的值为:");
for( i=0;i<result.length;i++){
for(j=0;j<result[i].length;j++){
System.out.print(result[i][j] + " ");
}
System.out.print("\n");
}
}
public static void main(String args[]){
Scanner input = new Scanner(System.in);
System.out.print("请输入矩阵A的行数和列数:");
int row = input.nextInt();
int column = input.nextInt();
System.out.println("请输入"+row +"行" + column+"列的矩阵A:");
int metrixA[][] = new int [row][column];//NEW一个数组,保存矩阵A
for(int i =0;i<row;i++)
for(int j =0;j<column;j++)
metrixA[i][j] = input.nextInt();
System.out.print("请输入矩阵B的行数和列数:");
int rowB = input.nextInt();
if(rowB != column)
JOptionPane.showMessageDialog(null,"矩阵A(m*n)和矩阵B(u*v)相乘需要满足 n==u!即A(m*n)-B(n*k)","温馨提示",JOptionPane.INFORMATION_MESSAGE);
int columnB = input.nextInt();
System.out.println("请输入"+rowB +"行" + columnB+"列的矩阵B:");
int metrixB[][] = new int [rowB][columnB];//NEW一个数组,保存矩阵B
for(int i =0;i<rowB;i++)
for(int j =0;j<columnB;j++)
metrixB[i][j] = input.nextInt();
multiMetrixAandB(metrixA,metrixB);
}
}
=================逆
package com.ql.until.huigui;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Test {
private int N;
private double[][] src;
private double[][] result;
public Test() {
}
public static void main(String[] args) throws Exception {
new Test().exec();
}
private void exec() throws Exception {
BufferedReader reader = new BufferedReader(new InputStreamReader(
System.in));
System.out.print("Input N: ");
System.out.flush();
String line = reader.readLine();
N = Integer.parseInt(line);
src = new double[N][];
result = new double[N][];
for (int i = 0; i < N; i++) {
line = reader.readLine();
src[i] = new double[N];
result[i] = new double[N];
result[i][i] = 1;
StringTokenizer st = new StringTokenizer(line, ", ");
int index = 0;
while (st.hasMoreTokens()) {
src[i][index] = Double.parseDouble(st.nextToken());
index++;
}
}
calCol(0);
calColBack(N - 1);
reInit();
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
System.out.print(src[i][j] + ", ");
}
System.out.print("\t ");
for (int j = 0; j < N; j++) {
System.out.print(result[i][j] + ", ");
}
System.out.println();
}
}
private void reInit() {
for (int i = 0; i < N; i++) {
double coefficient = 1 / src[i][i];
src[i][i] = 1;
for (int j = 0; j < N; j++)
result[i][j] *= coefficient;
}
}
private void calColBack(int col) {
for (int i = col - 1; i >= 0; i--) {
double coefficient = -1 * src[i][col] / src[col][col];
for (int z = 0; z < N; z++) {
src[i][z] += coefficient * src[col][z];
result[i][z] += coefficient * result[col][z];
}
}
if (col > 0)
calColBack(col - 1);
}
private void calCol(int col) {
for (int i = col + 1; i < N; i++) {
double coefficient = -1 * src[i][col] / src[col][col];
for (int z = 0; z < N; z++) {
src[i][z] += coefficient * src[col][z];
result[i][z] += coefficient * result[col][z];
}
}
if (col + 1 < N)
calCol(col + 1);
}
}