`

线性代数

J# 
阅读更多
线性代数中的部分内容(待续)

1.逆矩阵
对给定矩阵A,若存在一个矩阵B,满足 AB = BA = I,则称矩阵A可逆,并称矩阵B是A的逆矩阵。
求A的逆阵的方法
[ A | I ] ~ [ I | B ]    ---->  B即是A的逆阵

2.初等变换
(1) 对调矩阵中的任意两行(列)
(2) 以非零常数乘以矩阵中的某一行(列)中的所有元素
(3) 把矩阵中的某一行(列)的所有元素的k倍(k是常数)加到另一行(列)的对应元素上去
如果把矩阵A经过有限次初等变换变成矩阵B,就称矩阵A与B等价,记作A ~ B。

3.矩阵A可逆的充要条件:
A可表示为有限个初等矩阵的乘积

4. 行列式
行列式按行(列)展开法则
        行列式等于它的任一行(列)的各元素与其对应的代数余子式乘积之和。
性质及其推论:
    (1) 行列式与它的转置行列式相等.
    (2) 行列式中如果有两行(列)元素成比例,则此行列式等于零(包括有0行(列)、两行(列)相等).
    (3) 若行列式的某一行(列)的元素都可分成两数之和,则行列式可分成两个对应行列式的和.
    (4) 初等变换得到的行列式值的变化
        将方阵A中的某行(列)乘以k得到B,则|B| = k|A|
        将方阵A中的某行(列)的k倍加到另一行(列)得到B,则|B| = |A|
        交换方阵A中的任两行(列)得到B,则|B| = -|A|
    (5) 设A B 均为n阶方阵,则A与B的乘积矩阵的行列式等于A的行列式与B的行列式的乘积.即|AB| = |A| |B|

5.伴随阵和逆矩阵
  (1)n阶矩阵A,则AA^* = A^*A = |A|I
  (2)|A^*| = |A|^n
  (3)A^-1 = A^*/|A|
其中
| A11  A21  ...  An1 |
| A12  A22  ...  An2 |
|   .        .       .         . |
|   .        .        .        . | = A^*
|   .        .         .       . |
| A1n  A2n  ...  Ann |

6. 齐次线性方程组和非齐次线性方程组
(1) n元齐次线性方程组A m*n x = 0有非零解的充要条件是其系数矩阵的秩r(A) < n,且其通解中带有n-r(A)个任意参数。(m*n是矩阵的m行n列。非零解称为非平凡解,零解称为平凡解)
(2) n元非齐次线性方程组 Ax=b有解的充要条件是系数矩阵A的秩等于增广矩阵[A | b]的秩。
r(A) = r(A|b) = n 方程组有唯一解
r(A) = r(A|b) < n 方程组有无限多个解,且其通式中带有n-r(A)个任意参数
r(A) != r(A|b) 方程组无解
(暂用A|b来表示增广阵)

7. 向量空间
(1)给定向量组 a1, a2, ..,an,若存在不全为零的数k1, k2,...,kn,使得
k1a1 + k2a2 + ... + knan = 0,则称向量组是线性相关的。当且仅当k1 = k2 = .. = kn = 0时才成立,则称向量组是线性无关的。
(2)给定向量组 a1, a2, ..,an 线性相关的充要条件是由它所构成的矩阵A[a1, a2,..,an]的秩小于n。线性无关的充要条件是向量的秩等于n。

8.特征值问题与二次型
三角阵的特征值即为主对角线上的元素










以下是对线性代数中用到的性质和一些求解(持续跟新)。
package com.eric.matrix;

import java.util.Random;

/**
 * @author Yuanbo Han
 */
/**
 * @author Administrator
 *
 */
public class Matrix {
	private int line;
	private int column;
	private double[][] value;
	
	private boolean containsZeroLineOrColumn;//为了使得计算行列式容易
	private boolean isTriangularMatrix;//为了使得计算行列式容易
	
	/* ----------------- 构造函数 -----------------*/
	
	/**
	 * 产生一个有line行column列的一个矩阵,矩阵中的值没有被初始化。
	 * @param line
	 * @param column
	 */
	public Matrix(int line, int column) {
		if(line <= 0 || column <= 0){
			System.err.println("行列值必须是正数");
		}else{
			this.line = line;
			this.column = column;
			value = new double[line][column];
		}
	}
	
	/**
	 * 产生一个有line行column列的一个矩阵,矩阵中的值在[min,max)
	 * @param line
	 * @param column
	 */
	public Matrix(int line, int column, int min, int max) {
		super();
		if(line <= 0 || column <= 0){
			System.err.println("行列值必须是正数");
		}else if(min > max){
			System.err.println("最小值不能大于最大值");
		}else{
			this.line = line;
			this.column = column;
			value = new double[line][column];
			for(int i=0;i<line;i++){
				for(int j=0;j<column;j++){
					value[i][j] = this.randomBetween(min,max);
				}
			}
			this.initializeForDeterminant();
		}
	}

	/**
	 * 讲一个二维数组指定到matrix
	 * @param value
	 */
	public Matrix(double[][] value) {
		super();
		if(value != null){
			try {
				this.value = value;
				this.line = value.length;
				this.column = value[0].length;
				this.initializeForDeterminant();
			} catch (Exception e) {
				System.err.println("出入的矩阵格式不正确");
				e.printStackTrace();
			}
		}else{
			System.err.println("传入的矩阵不能为空");
		}
	}

	public Matrix(Matrix matrix){
		this.setMatrix(matrix);
	}
	
	/* ----------------- 计算函数 -----------------*/
	
	public Matrix add(Matrix val){
		if(this.isCalculableForAdd(val)){
			Matrix matrix = new Matrix(this.getLine(),this.getColumn());
			for(int i=0;i<this.getLine();i++){
				for(int j=0;j<this.getColumn();j++){
					matrix.getValue()[i][j] = this.value[i][j] + val.getValue()[i][j];
				}
			}
			return matrix;
		}
		System.err.println("两个矩阵不能进行加法运算");
		return null;
	}

	public Matrix subtract(Matrix val){
		val = val.multiple(-1);
		return this.add(val);
	}

	public Matrix multiple(Matrix val){
		if(this.isCalculableForMultiple(val)){
			Matrix matrix = new Matrix(this.getLine(),val.getColumn());
			for(int i=0;i<this.getLine();i++){
				for(int j=0;j<val.getColumn();j++){
					double temp = 0;
					for(int k=0;k<this.getColumn();k++){
						temp += this.value[i][k] * val.getValue()[k][j];
					}
					matrix.getValue()[i][j] = temp;
				}
			}
			return matrix;
		}
		System.err.println("两个矩阵不能进行乘法运算");
		return null;
	}
	
	public Matrix pow(int exponent){
		if(this.getLine() != this.getColumn()){
			System.err.println("不能进行幂运算");
			return null;
		}else{
			if(exponent >= 1){
				Matrix matrix = Matrix.generateIdentityMatrix(this.getLine());
				for(int i=0;i<exponent;i++){
					matrix = matrix.multiple(this);
				}
				return matrix;
			}else{
				System.err.println("指数只能为正数");
				return null;
			}
		}
	}
	
	/**
	 * 用m(系数)乘以矩阵
	 * @param m
	 * @return
	 */
	public Matrix multiple(double m){
		for(int i=0;i<this.getLine();i++){
			for(int j=0;j<this.getColumn();j++){
				this.value[i][j] *= m;
			}
		}
		return this;
	}
	
	/**
	 * 得到该矩阵的转置矩阵
	 * @return
	 */
	public Matrix transpose(){
		Matrix matrix = new Matrix(this.getColumn(), this.getLine());
		for(int i=0;i<this.getLine();i++){
			for(int j=0;j<this.getColumn();j++){
				matrix.getValue()[j][i] = this.value[i][j];
			}
		}
		return matrix;
	}
	
	/**
	 * 计算行列式的时候,为了提高效率,进行了如下处理:
	 * 	1	首先判断该行列式是否存在某行(列)为全零		行列式为0
	 * 	2	是否存在某两行(列)成比例					行列式为0
	 * 	3	是否是三角阵								行列式为对角线元素的乘积
	 * 	4	然后再计算行列式,且行列式使用递归进行计算,递归结束的条件是行列式为三阶或者二阶
	 * 计算该矩阵的行列式
	 * @return
	 */
	public double det(){
		if(this.getLine() != this.getColumn()){
			System.err.println("只有方阵才能进行求行列式运算");
			return 0;
		}
		if(this.isContainsZeroLineOrColumn()){
			return 0;
		} else if(this.isTriangularMatrix()){//三角阵的行列式是对角线元素的乘积
			double result = 1;
			for(int i=0;i<this.getLine();i++){
				result *= this.value[i][i];
			}
			return result;
		}else{
			if(this.getLine() == 2 || this.getLine() == 3){//结束递归的条件
				if(this.getLine() == 3){
					double result = 
						     this.value[0][0] * this.value[1][1] * this.value[2][2] 
					       + this.value[0][1] * this.value[1][2] * this.value[2][0]
					       + this.value[0][2] * this.value[1][0] * this.value[2][1]
					       - this.value[0][2] * this.value[1][1] * this.value[2][0]
					       - this.value[0][0] * this.value[1][2] * this.value[2][1]
					       - this.value[0][1] * this.value[1][0] * this.value[2][2];
					return result;
				}else{
					double result = this.value[0][0] * this.value[1][1] - this.value[1][0] * this.value[0][1];
					return result;
				}
			} else{
				double result = 0;
				for(int j=0;j<this.getColumn();j++){
					if(this.getValue()[0][j] != 0){
						Matrix matrix = this.removeLineAndColumn(1, j+1);//总是以第一行来进行计算
						result += this.getValue()[0][j] * Math.pow(-1, j) * matrix.det();//Math.pow(-1, j)应该是Math.pow(-1, 1+j+1) = Math.pow(-1, j); 
					}
				}
				return result;
			}
		}
	}
	
	/**
	 * 求该矩阵元素aij的代数余子式
	 * @param i
	 * @param j
	 * @return
	 */
	public double algebraicComplement_I_J(int i, int j){
		if(this.getLine() != this.getColumn()){
			System.err.println("只有方阵才能进行求代数余子式运算");
			return 0;
		}
		if(i < 1 || j < 1 || i > this.getLine() || j > this.getColumn()){
			System.err.println("传入的参数有错误");
			return 0;
		}
		if(this.getLine() == 2 && this.getColumn() == 2){
			return Math.pow(-1, i+j) * this.getValue()[i%2][j%2];
		}else{
			Matrix matrix = this.removeLineAndColumn(i, j);
			return Math.pow(-1, i+j) * matrix.det();
		}
	}
	
	/**
	 * 求该矩阵的伴随矩阵
	 * @return
	 */
	public Matrix adjA(){
		if(this.getLine() != this.getColumn()){
			System.err.println("只有方阵才能进行求伴随阵运算");
			return null;
		}
		Matrix matrix = new Matrix(this.getLine(),this.getColumn());
		for(int i=0;i<this.getLine();i++){
			for(int j=0;j<this.getColumn();j++){
				matrix.getValue()[i][j] = this.algebraicComplement_I_J(j+1, i+1);//将第j+1行,i+1列的代数余子式放到i+1行,j+1列.
			}
		}
		return matrix;
	}
	
	/**
	 * 求该矩阵的逆矩阵
	 * @return
	 */
	public Matrix inverse(){
		if(this.getLine() != this.getColumn()){
			System.err.println("只有方阵才能进行求逆矩阵运算");
			return null;
		}
		double det = this.det();
		if(det != 0){
			Matrix matrix = this.adjA();
			System.out.println("--------原始的逆矩阵是----------");//考虑到有可能det不能被矩阵中的所有元素除以之后得到无限小数
			System.out.print(matrix);
			System.out.println(" * 1 / " + det);
			System.out.println("-------------------------------");
			matrix = matrix.multiple(1 / det);
			return matrix;
		}else{
			System.err.println("行列式为0,故逆矩阵不存在");
			return null;
		}
	}
	
	/**
	 * 解方程组
	 * @param b
	 * @return
	 */
	public double[] solve(double[] b){
		return null;
	}
	
	/**
	 * 得到矩阵的秩
	 * @return
	 */
	public int rank(){
		
		return 0;
	}
	
	/**
	 * 得到矩阵的迹
	 * @return
	 */
	public double trace(){
		
		return 0;
	}
	
	/**
	 * 产生一个line行 和 line列的单位矩阵
	 * @param line
	 * @return
	 */
	public static Matrix generateIdentityMatrix(int line){
		if(line > 0){
			Matrix matrix = new Matrix(line,line);
			for(int i=0;i<line;i++){
				matrix.getValue()[i][i] = 1;
			}
			return matrix;
		}
		return null;
	}
	
	@Override
	public boolean equals(Object obj) {
		if(obj == null || !(obj instanceof Matrix)){
			return false;
		}
		Matrix matrix = (Matrix)obj;
		if((matrix.getLine() != this.getLine()) || (matrix.getColumn() != this.getColumn())){
			return false;
		}else{
			for(int i=0;i<this.getLine();i++){
				for(int j=0;j<this.getColumn();j++){
					if(this.value[i][j] != matrix.getValue()[i][j]){
						return false;
					}
				}
			}
		}
		return true;
	}

	@Override
	public String toString() {
		StringBuffer sb = new StringBuffer();
		for(int i=0;i<value.length;i++){
			sb.append("|\t");
			for(int j=0;j<value[0].length;j++){
				sb.append(value[i][j] + "\t");
			}
			sb.append("|\n");
		}
		sb.delete(sb.length()-1, sb.length());
		return sb.toString();
	}
	
	/* ----------------- 辅助函数 -----------------*/
	
	/**
	 * 传入的line参数是按照数学中的从1开始的
	 * @param line
	 * @param replacemant
	 * @return
	 */
	public Matrix replaceLine(int line, double[] replacemant){
		if(line < 1 || line > this.getLine() || replacemant == null || replacemant.length != this.getColumn()){
			System.err.println("不能用指定的内容替换原来中矩阵中的值");
			return null;
		}
		
		Matrix matrix = new Matrix(this);
		for(int j=0;j<this.getColumn();j++){
			matrix.getValue()[line-1][j] = replacemant[j];
		}
		return matrix;
	}
	
	/**
	 * 传入的column参数是按照数学中的从1开始的
	 * @param column
	 * @param replacemant
	 * @return
	 */
	public Matrix replaceColumn(int column, double[] replacemant){
		if(column < 1 || column > this.getColumn() || replacemant == null || replacemant.length != this.getLine()){
			System.err.println("不能用指定的内容替换原来中矩阵中的值");
			return null;
		}
		
		Matrix matrix = new Matrix(this);
		for(int i=0;i<this.getLine();i++){
			matrix.getValue()[i][column-1] = replacemant[i];
		}
		return matrix;
	}
	
	/**
	 * 传入的参数是按照数学中的从1开始的
	 * @param line 
	 * @return
	 */
	public Matrix removeLine(int line){
		if(line < 1 || line > this.getLine()){
			System.err.println("传入的line值有问题");
			return null;
		}
		Matrix matrix = new Matrix(this.getLine() - 1,this.getColumn());
		int index = -1;
		for(int i=0;i<this.getLine();i++){
			if(i != (line - 1)){
				index++;
				for(int j=0;j<this.getColumn();j++){
					matrix.getValue()[index][j] = this.getValue()[i][j];
				}
			}
		}
		return matrix;
	}

	/**
	 * 传入的column参数是按照数学中的从1开始的
	 * @param column
	 * @return
	 */
	public Matrix removeColumn(int column){
		if(column < 1 || column > this.getColumn()){
			System.err.println("传入的column值有问题");
			return null;
		}
		Matrix matrix = new Matrix(this.getLine(),this.getColumn() - 1);
		for(int i=0;i<this.getLine();i++){
			int index = -1;
			for(int j=0;j<this.getColumn();j++){
				if(j != (column - 1)){
					index++;
					matrix.getValue()[i][index] = this.getValue()[i][j];
				}
			}
		}
		return matrix;
	}
	
	/**
	 * 传入的line,column参数是按照数学中的从1开始的
	 * @param line
	 * @param column
	 * @return
	 */
	public Matrix removeLineAndColumn(int line, int column){
		if(line < 1 || column < 1 || line > this.getLine() || column > this.getColumn()){
			System.err.println("传入的line或者column值有问题");
			return null;
		}
		Matrix matrix = new Matrix(this.getLine() - 1,this.getColumn() - 1);
		int _i = -1;
		
		for(int i=0;i<this.getLine();i++){
			if(i != (line - 1)){
				_i++;
				int _j = -1;
				for(int j=0;j<this.getColumn();j++){
					if(j != (column - 1)){
						_j++;
						matrix.getValue()[_i][_j] = this.getValue()[i][j];
					}
				}
			}
		}
		return matrix;
	}
	
	/**
	 * 传入的line参数是按照数学中的从0开始的.
	 * 	0的话代表将insertion插入到矩阵的第一行
	 * @param line
	 * @param insertion
	 * @return
	 */
	public Matrix addLineAfter(int line, double[] insertion){
		if(line < 0 || line > this.getLine() || insertion == null || insertion.length != this.getColumn()){
			System.err.println("不能将指定的内容插入到原来的矩阵中");
			return null;
		}
		Matrix matrix = new Matrix(this.getLine() + 1, this.getColumn());
		int distance = 0;
		for(int i=0;i<this.getLine();i++){
			for(int j=0;j<this.getColumn();j++){
				if(i == line){//line 代表着将insertion插入到以数组0基础的line下标位置
					for(int k=0;k<insertion.length;k++){
						matrix.getValue()[i][j] = insertion[k]; 
					}
					distance = 1;
				}
				matrix.getValue()[i+distance][j] = this.getValue()[i][j];
			}
		}
		if(line == this.getLine()){
			for(int k=0;k<insertion.length;k++){
				matrix.getValue()[line][k] = insertion[k]; 
			}
		}
		return matrix;
	}

	/**
	 * 传入的column参数是按照数学中的从0开始的.
	 * 	0的话代表将insertion插入到矩阵的第一列
	 * @param column
	 * @param insertion
	 * @return
	 */
	public Matrix addColumnAfter(int column, double[] insertion){
		if(column < 0 || column > this.getColumn() || insertion == null || insertion.length != this.getLine()){
			System.err.println("不能将指定的内容插入到原来的矩阵中");
			return null;
		}
		Matrix matrix = new Matrix(this.getLine(), this.getColumn() + 1);
		for(int i=0;i<this.getLine();i++){
			int distance = 0;
			for(int j=0;j<this.getColumn();j++){
				if(j == column){//column 代表着将insertion插入到以数组0基础的column下标位置
					matrix.getValue()[i][j] = insertion[j]; 
					distance = 1;
				}
				matrix.getValue()[i][j+distance] = this.getValue()[i][j];
			}
		}
		if(column == this.getColumn()){
			for(int k=0;k<insertion.length;k++){
				matrix.getValue()[k][column] = insertion[k]; 
			}
		}
		return matrix;
	}
	
	/**
	 * 将after矩阵加入到矩阵的右面
	 * @param after
	 * @return
	 */
	public Matrix assembleHorizontal(Matrix after){
		if(after == null){
			return this;
		}else if(after.getLine() != this.getLine()){
			System.err.println("不能组合两个矩阵");
			return null;
		}else{
			Matrix matrix = new Matrix(this.getLine(),this.getColumn() + after.getColumn());
			for(int i=0;i<this.getLine();i++){
				int index = 0;
				for(int j=0;j<this.getColumn();j++){
					matrix.getValue()[i][index] = this.getValue()[i][j];
					index++;
				}
				for(int k=0;k<after.getColumn();k++){
					matrix.getValue()[i][index] = after.getValue()[i][k];
					index++;
				}
			}
			return matrix;
		}
	}
	
	/**
	 * 将after矩阵加到矩阵的下面
	 * @param after
	 * @return
	 */
	public Matrix assembleVertical(Matrix after){
		if(after == null){
			return this;
		}else if(after.getColumn() != this.getColumn()){
			System.err.println("不能组合两个矩阵");
			return null;
		}else{
			Matrix matrix = new Matrix(this.getLine()+after.getLine(),this.getColumn());
			for(int i=0;i<this.getLine();i++){
				for(int j=0;j<this.getColumn();j++){
					matrix.getValue()[i][j] = this.getValue()[i][j];
				}
			}
			for(int i=0;i<after.getLine();i++){
				for(int j=0;j<after.getColumn();j++){
					matrix.getValue()[i+this.getLine()][j] = after.getValue()[i][j];
				}
			}
			return matrix;
		}
	}
	
	/* ----------------- 以下初等变换函数 -----------------*/
	
	/**
	 * 交换第line1行和第line2行的内容
	 * 传入的line1和line2的值是数学中的从1开始的,而不是编程语言中的0
	 * @param line1
	 * @param line2
	 * @return
	 */
	public Matrix exchangeLine(int line1, int line2){
		if(line1 < 1 || line2 < 1 || line2 > this.getLine() || line1 > this.getLine()){
			System.err.println("传入的参数有误");
			return null;
		}
		if(line1 == line2){
			System.out.println("line1=line2,不需要交换");
			return this;
		}
		
		Matrix matrix = new Matrix(this);
		double[] temp = new double[matrix.getColumn()];
		
		for(int j=0;j<matrix.getColumn();j++){
			temp[j] = matrix.getValue()[line1-1][j];
		}
		
		for(int j=0;j<matrix.getColumn();j++){
			matrix.getValue()[line1-1][j] = matrix.getValue()[line2-1][j];
		}
		
		for(int j=0;j<matrix.getColumn();j++){
			matrix.getValue()[line2-1][j] = temp[j];
		}
		
		return matrix;
	}
	
	/**
	 * 交换第column1列与第column2列的内容
	 * 传入的column1和column2的值是数学中的从1开始的,而不是编程语言中的0
	 * @param column1
	 * @param column2
	 * @return
	 */
	public Matrix exchangeColumn(int column1, int column2){
		if(column1 < 1 || column2 < 1 || column2 > this.getLine() || column1 > this.getLine()){
			System.err.println("传入的参数有误");
			return null;
		}
		if(column1 == column2){
			System.out.println("column1=column2,不需要交换");
			return this;
		}
		
		Matrix matrix = new Matrix(this);
		double[] temp = new double[matrix.getLine()];
		
		for(int i=0;i<matrix.getLine();i++){
			temp[i] = matrix.getValue()[i][column1-1];
		}
		
		for(int i=0;i<matrix.getLine();i++){
			matrix.getValue()[i][column1-1] = matrix.getValue()[i][column2-1];
		}
		
		for(int i=0;i<matrix.getLine();i++){
			matrix.getValue()[i][column2-1] = temp[i];
		}
		
		return matrix;
	}
	
	/**
	 * 将第line行乘以k
	 * @param line
	 * @param k
	 * @return
	 */
	public Matrix r_i(int line, int k){
		if(line < 1 || line > this.getLine()){
			System.err.println("传入的参数有问题");
			return null;
		}
		
		Matrix matrix = new Matrix(this);
		for(int j=0;j<this.getColumn();j++){
			matrix.getValue()[line-1][j] *= k;
		}
		return matrix;
	}
	
	/**
	 * 将第column列乘以k
	 * @param column
	 * @param k
	 * @return
	 */
	public Matrix c_i(int column, int k){
		if(column < 1 || column > this.getColumn()){
			System.err.println("传入的参数有问题");
			return null;
		}
		
		Matrix matrix = new Matrix(this);
		for(int i=0;i<this.getLine();i++){
			matrix.getValue()[i][column-1] *= k;
		}
		return matrix;
	}
	
	/**
	 * 将第from行乘以k加到第to行
	 * from 和 to 都是从1开始的
	 * @param to
	 * @param from
	 * @param k
	 * @return
	 */
	public Matrix r_to_from_k(int to, int from, double k){
		if(from < 1 || to < 1 || from > this.getLine() || to > this.getLine()){
			System.err.println("输入的参数有误");
			return null;
		}
		
		Matrix matrix = new Matrix(this);
		
		for(int j=0;j<this.getColumn();j++){
			matrix.getValue()[to-1][j] += (matrix.getValue()[from-1][j] * k);
		}
		return matrix;
	}

	/**
	 * 将第from列乘以k加到第to列
	 * from 和 to 都是从1开始的
	 * @param to
	 * @param from
	 * @param k
	 * @return
	 */
	public Matrix c_to_from_k(int to, int from, double k){
		if(from < 1 || to < 1 || from > this.getColumn() || to > this.getColumn()){
			System.err.println("输入的参数有误");
			return null;
		}
		
		Matrix matrix = new Matrix(this);
		for(int i=0;i<this.getLine();i++){
			matrix.getValue()[i][to-1] += (matrix.getValue()[i][from-1] * k);
		}
		return matrix;
	}
	
	/* ----------------- 以上初等变换函数 -----------------*/
	
	/**
	 * 为了使得行列式的计算可以提高效率而执行的一些操作,主要是初始化
	 *	containsZeroLineOrColumn;
	 *	isTriangularMatrix;
	 */
	private void initializeForDeterminant(){
		this.containsZeroLineOrColumn();
		this.triagularMatrix();
	}

	private void containsZeroLineOrColumn(){
		for(int i=0;i<this.getLine();i++){
			boolean contains = true;
			for(int j=0;j<this.getColumn();j++){
				if(this.getValue()[i][j] != 0){
					contains = false;
					break;
				}
			}
			if(contains){
				this.setContainsZeroLineOrColumn(true);
				break;
			}
		}
		
		if(!this.isContainsZeroLineOrColumn()){
			for(int j=0;j<this.getColumn();j++){
				boolean contains = true;
				for(int i=0;i<this.getLine();i++){
					if(this.getValue()[i][j] != 0){
						contains = false;
						break;
					}
				}
				if(contains){
					this.setContainsZeroLineOrColumn(true);
					break;
				}
			}
		}
	}
	
	private void triagularMatrix(){
		boolean isTriagular = true;
		for(int i=0;i<this.getLine()-1;i++){// 上三角矩阵
			for(int j=i+1;j<this.getColumn();j++){
				if(this.getValue()[i][j] != 0){
					isTriagular = false;
					break;
				}
			}
			if(!isTriagular){
				break;
			}
		}
		if(isTriagular){
			this.setTriangularMatrix(true);
		}
		
		
		if(!isTriagular){// 如果不是上三角阵
			isTriagular = true;
			for(int i=1;i<this.getLine();i++){// 下三角矩阵
				for(int j=0;j<i;j++){
					if(this.getValue()[i][j] != 0){
						isTriagular = false;
						break;
					}
				}
				if(!isTriagular){
					break;
				}
			}
			if(isTriagular){
				this.setTriangularMatrix(true);
			}
		}
	}
	
	/**
	 * 将指定的matrix中的value[][], line, column 指定到本类中
	 * @param matrix
	 */
	public void setMatrix(Matrix matrix){
		this.setLine(matrix.getLine());
		this.setColumn(matrix.getColumn());
		this.value = new double[this.getLine()][this.getColumn()];
		for(int i=0;i<this.getLine();i++){
			for(int j=0;j<this.getColumn();j++){
				this.value[i][j] = matrix.getValue()[i][j];
			}
		}
		this.initializeForDeterminant();
	}
	
	/**
	 * 得到矩阵的深层拷贝
	 * @return
	 */
	public Matrix copy(){
		Matrix matrix = new Matrix(this);
		return matrix;
	}
	
	/**
	 * 得到指定位置的元素的值
	 * 是从1开始的
	 * @param i
	 * @param j
	 * @return
	 */
	public double get(int i, int j){
		if(i < 1 || j < 1 || i > this.getLine() || j > this.getColumn()){
			System.err.println("传入的参数有问题");
			return Double.MIN_VALUE;
		}
		return this.getValue()[i-1][j-1];
	}
	
	/* ----------------- getter/setter 函数 -----------------*/
	
	public int getLine() {
		return line;
	}

	public void setLine(int line) {
		this.line = line;
	}

	public int getColumn() {
		return column;
	}

	public void setColumn(int column) {
		this.column = column;
	}

	public double[][] getValue() {
		return value;
	}

	public void setValue(double[][] value) {
		this.value = value;
	}
	
	private double randomBetween(int min, int max){
		int value = max - min;
		return new Random().nextInt(value) + min;
	}
	
	private boolean isCalculableForAdd(Matrix val){
		if(!val.isValidMatrix() || this.getLine() != val.getLine() || this.getColumn() != val.getColumn()){
			return false;
		}
		return true;
	}

	private boolean isCalculableForMultiple(Matrix val){
		if(!val.isValidMatrix() || this.getColumn() != val.getLine()){
			return false;
		}
		return true;
	}
	
	private boolean isValidMatrix(){
		if((this == null) || this.getLine() <= 0 || this.getColumn() <= 0){
			return false;
		}
		return true;
	}

	public boolean isContainsZeroLineOrColumn() {
		return containsZeroLineOrColumn;
	}

	public void setContainsZeroLineOrColumn(boolean containsZeroLineOrColumn) {
		this.containsZeroLineOrColumn = containsZeroLineOrColumn;
	}

	public boolean isTriangularMatrix() {
		return isTriangularMatrix;
	}

	public void setTriangularMatrix(boolean isTriangularMatrix) {
		this.isTriangularMatrix = isTriangularMatrix;
	}

	public static void main(String[] args) {
		Matrix matrix = new Matrix(new double[][]{{1,2,3},{2,2,1},{3,4,3}});
		System.out.println("matrix");
		System.out.println(matrix);
		System.out.println("matrix.removeLine(1)");
		System.out.println(matrix.removeLine(1));
		System.out.println("matrix.removeColumn(1)");
		System.out.println(matrix.removeColumn(1));
		System.out.println("matrix.removeLineAndColumn(1, 1)");
		System.out.println(matrix.removeLineAndColumn(1, 1));;
		System.out.println("matrix.replaceLine(1, new double[] { 4, 4, 4 })");
		System.out.println(matrix.replaceLine(1, new double[] { 4, 4, 4 }));
		System.out.println("matrix.replaceColumn(1, new double[] { 4, 4, 4 })");
		System.out.println(matrix.replaceColumn(1, new double[] { 4, 4, 4 }));
		System.out.println("matrix.addLineAfter(2, new double[] { 4, 4, 4 })");
		System.out.println(matrix.addLineAfter(2, new double[] { 4, 4, 4 }));
		System.out.println("matrix.addColumnAfter(3, new double[] { 4, 4, 4 })");
		System.out.println(matrix.addColumnAfter(3, new double[] { 4, 4, 4 }));
		
		System.out.println("matrix.exchangeLine(1, 2)");
		System.out.println(matrix.exchangeLine(1, 2));
		System.out.println("matrix.exchangeColumn(1, 2)");
		System.out.println(matrix.exchangeColumn(1, 2));
		System.out.println("matrix.c_i(1, 2)");
		System.out.println(matrix.c_i(1, 2));
		System.out.println("matrix.r_i(1, 2)");
		System.out.println(matrix.r_i(1, 2));
		System.out.println("matrix.c_to_from_k(1, 2, 1)");
		System.out.println(matrix.c_to_from_k(1, 2, 1));
		System.out.println("matrix.r_to_from_k(1, 2, 1)");
		System.out.println(matrix.r_to_from_k(1, 2, 1));
		
		System.out.println("matrix.algebraicComplement_I_J(3, 1)");
		System.out.println(matrix.algebraicComplement_I_J(3, 1));
		System.out.println("matrix.det()");
		System.out.println(matrix.det());
		System.out.println("matrix.adjA()");
		System.out.println(matrix.adjA());
		System.out.println("matrix.inverse()");
		System.out.println(matrix.inverse());
		
		Matrix matrix2 = new Matrix(new double[][]{{2,3,4},{5,6,7},{8,9,10}});
		System.out.println("matrix2");
		System.out.println(matrix2);
		System.out.println("matrix.assembleHorizontal(matrix2)");
		System.out.println(matrix.assembleHorizontal(matrix2));
		System.out.println("matrix.assembleVertical(matrix2)");
		System.out.println(matrix.assembleVertical(matrix2));
		
		Matrix matrix3 = new Matrix(new double[][]{{3,0,0,0},{3,2,4,1},{-1,0,5,0},{2,0,6,-1}});
		System.out.println("matrix3");
		System.out.println(matrix3);
		System.out.println("matrix3.det()");
		System.out.println(matrix3.det());
		System.out.println(new Matrix(new double[][] {{0,0,0},{1,2,3}, {2,3,4}}).det());//存在0行的矩阵
		System.out.println(new Matrix(new double[][] {{1,2,0},{2,3,0}, {3,4,0}}).det());//存在0列的矩阵
		System.out.println(new Matrix(new double[][] {{1,0,0},{1,2,0},{1,2,3}}).det());//上三角矩阵
		System.out.println(new Matrix(new double[][] {{1,2,3},{0,1,2},{0,0,1}}).det());//下三角矩阵
		
	}
}
  • 大小: 63.1 KB
  • 大小: 10.4 KB
  • 大小: 40.7 KB
  • 大小: 5.4 KB
分享到:
评论

相关推荐

    线性代数应用案例线性代数应用案例

    线性代数是数学的一个重要分支,它在现代科学和技术中扮演着不可或缺的角色。这个主题不仅涉及矩阵、向量、线性方程组等基本概念,还深入到特征值、特征向量、行列式以及线性空间等领域。线性代数的应用广泛,包括...

    机器学习+线性代数基础

    机器学习+线性代数基础 机器学习和线性代数是两个紧密相连的领域,它们之间存在着紧密的联系。机器学习算法的实现离不开线性代数的基础理论,例如矩阵、向量、张量等概念都是机器学习算法的核心组成部分。 在机器...

    线性代数经典25题 线性代数经典25题 线性代数经典25题

    线性代数经典25题线性代数经典25题线性代数经典25题线性代数经典25题线性代数经典25题线性代数经典25题线性代数经典25题线性代数经典25题线性代数经典25题线性代数经典25题线性代数经典25题线性代数经典25题线性代数...

    线性代数导论gilbert_strang:第四版 英文版

    线性代数是数学的一个重要分支,它的核心在于研究向量空间(或线性空间)、线性变换以及这两个概念的基本性质。Gilbert Strang的《线性代数导论》第四版是一本备受推崇的教科书,旨在向读者介绍线性代数的基本概念和...

    线性代数精彩应用案例.pdf

    线性代数精彩应用案例 本资源摘要信息将对线性代数的应用案例进行详细的解释和分析。线性代数是数学的一个重要分支,它广泛应用于各个领域,包括计算机科学、数据科学、物理科学、工程学等。 标签:互联网 描述:...

    线性代数课件-很好的课件,详细

    线性代数是数学的一个重要分支,它在计算机科学、工程学、物理学等多个领域有着广泛的应用。这份"线性代数课件"以其详尽易懂的特点,为学习者提供了全面而深入的理解线性代数知识的机会。 首先,我们要了解线性代数...

    线性代数.zip

    这个名为“线性代数.zip”的压缩包包含了一系列关于大连海事大学线性代数课程的课件,包括PPT演示文稿和重点题型的PDF文档,适合学生或对线性代数感兴趣的学习者进行自我学习和复习。 1. **向量组的线性相关性**...

    线性代数保研面试准备doc文档合集整理.zip

    线性代数是数学的一个重要分支,它在现代科学和技术中扮演着不可或缺的角色,尤其在计算机科学、物理学、工程学以及数据分析等领域应用广泛。对于保研面试的准备来说,掌握线性代数的基本概念、理论及其应用至关重要...

    数值线性代数(徐树方)

    数值线性代数是线性代数的一个分支,主要研究如何运用数值方法解决线性代数方程组、特征值问题等线性系统的计算问题。徐树方编著的《数值线性代数》一书,深入探讨了这一领域的内容。该书不仅涉及了基础的数值线性...

    国外经典教材 线性代数 原书第七版 中文 利昂著

    《国外经典教材 线性代数 原书第七版 中文 利昂著》是一本备受推崇的线性代数教材,以其深入浅出的讲解和丰富的实例深受学生和教师的喜爱。线性代数作为数学的一个重要分支,是理工科及许多其他领域的基础课程,它在...

    线性代数(北大社周勇版)课后习题答案详解大全

    线性代数是数学的一个重要分支,它在计算机科学、物理学、工程学等多个领域有着广泛的应用。北京大学出版社出版的周勇版《线性代数》是一本深入浅出的教材,其课后习题旨在帮助学生巩固理论知识,提高解决实际问题的...

    《线性代数》牛莉-电子教案

    线性代数是一门在数学、物理、计算机科学和工程领域具有广泛应用的学科。它主要研究向量、矩阵、线性方程组、线性空间、线性变换等概念及其相互关系。牛莉教授编写的《线性代数》电子教案,作为非数学专业大学本科...

    上海交通大学线性代数教材

    《上海交通大学线性代数教材》是一份专为学习线性代数的学子精心编纂的教学资料,由上海交通大学的专家团队倾力打造。线性代数是现代数学的重要分支,也是理工科学生必修的基础课程,对于理解和应用数学模型、解决...

    哈尔滨工业大学-线性代数试题及答案.pdf

    "哈尔滨工业大学-线性代数试题及答案" 哈尔滨工业大学的线性代数试题及答案是线性代数领域中的经典试题,涵盖了线性代数的基本概念、矩阵理论、线性变换、特征值和特征向量等重要知识点。本试题集包括选择题和非...

    gilbert线性代数+答案

    《Gilbert线性代数+答案》是一套针对麻省理工学院线性代数课程的教材及配套解决方案,由著名数学家Gilbert Strang编著。这套资源包含了《Introduction to Linear Algebra》第四版的原文书以及对应的课后习题答案,为...

    居于马线性代数

    清华大学出版社于1994年出版的《居于马线性代数》是一本由居于马等编著的经典线性代数教材。它主要面向高等院校理工科学生,全书内容涵盖了线性代数的多个核心概念与理论,并且根据全国工科数学课程指导委员会的...

    线性代数课程讲解资源

    线性代数是数学的一个重要分支,它在计算机科学、物理学、工程学、经济学等多个领域都有广泛应用。这个压缩包文件的资源显然是一套线性代数的视频教程,包括了从第一课到第八课的内容,旨在帮助学习者理解和掌握线性...

    线性代数导论第5版课后答案

    线性代数是数学的一个基础分支,它研究向量空间(也称为线性空间)、线性映射(也称为线性变换)以及这两个概念的基本性质。线性代数导论通常是入门级别的教材,旨在为学生介绍线性代数的基本概念和方法。Gilbert ...

    线性代数 原书第七版 利昂著

    线性代数是数学的一个重要分支,主要研究向量空间(也称为线性空间)、线性映射(包括矩阵和线性变换)以及这两个概念的基本性质。线性代数不仅是理工科学生的基础课程,也广泛应用于物理、计算机科学、经济学、...

Global site tag (gtag.js) - Google Analytics