`

线性代数

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

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

    数值线性代数(徐树方)

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

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

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

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

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

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

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

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

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

    python向量、矩阵、线性代数.pdf

    python向量、矩阵、线性代数.pdf 本文档主要讲述了Python中向量、矩阵和线性代数的概念和应用。下面是从文档中提取的重要知识点: 向量 * 向量是一个数学对象,表示一个方向和大小的对象 * 在Python中,向量可以...

    gilbert线性代数+答案

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

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

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

    居于马线性代数

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

    线性代数(第二版)(复旦社郝志峰版)课后习题答案详解大全

    《线性代数》作为数学的一个重要分支,在现代科学技术领域具有不可替代的地位。郝志峰编著的《线性代数(第二版)》针对理工科学生,深入浅出地涵盖了线性代数的核心概念和方法。作为该教材的配套资源,《线性代数...

Global site tag (gtag.js) - Google Analytics