1)2)LU分解(是/否部分主元法)+

3)施密特(Schmidt)QR分解 +

4)吉文斯(Givens)QR分解 +

5)Household QR分解 代码详解

可直接运行版本复测试用例(java8版)

更改测试用例:更改主方法内数组数据,或直接重写I/O流

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;public class Fractorization {public static void main(String args[]){run(LUFractorization(new double[][]{{2.0, 2.0, 2.0},{4.0, 7.0, 7.0},{6.0, 18.0, 22.0},}, 0));run(LUFractorization(new double[][]{{1.0, 2.0, -3.0, 4.0},{4.0, 8.0, 12.0, -8.0},{2.0, 3.0, 2.0, 1.0},{-3.0, -1.0, 1.0, -4.0}}, 1));run(SchmidtQR(new double[][]{{1, 0, -1},{1, 2, 1},{1, 1, -3},{0, 1, 1}}));run(GivensQR(new double[][]{{0, -20, -14},{3, 27, -4},{4, 11, -2}}));run(HouseholdQR(new double[][]{{1, 19, -34},{-2, -5, 20},{2, 8, 37}}));}public static void run(List<double[][]> list){if(list.size() == 3){System.out.println("The matrix L of A is");print(list.get(0));System.out.println("The matrix U of A is");print(list.get(1));System.out.println("The matrix P of A is");print(list.get(2));System.out.println();}else{System.out.println("The matrix Q of A is");print(list.get(0));System.out.println("The matrix R of A is");print(list.get(1));System.out.println();}}public static List<double[][]> LUFractorization(double[][] matrix, int model){List<double[][]> list = new ArrayList<>();int length = matrix.length;double[][] L = new double[length][length];double[][] U = new double[length][length];double[][] P = new double[length][length];int[] indexP = new int[length];for(int i = 0; i < length; i++)indexP[i] = i;for(int i = 0; i < length; i++){if(model == 1)exchange(matrix, L, indexP, i, findExchange(matrix, i));for(int j = i+1; j < length; j++)L[j][i] = eliminate(matrix, i, j);}for(int i = 0; i < length; i++) {for(int j = length-1; j >= i; j--)U[i][j] = matrix[i][j];if(model == 1)P[i][indexP[i]] = 1;elseP[i][i] = 1;L[i][i] = 1;}list.add(L);list.add(U);list.add(P);return list;}public static List<double[][]> SchmidtQR(double[][] matrix){int m = matrix.length;int n = matrix[0].length;double[][] R = new double[n][n];List<double[][]> outList = new LinkedList<>();for(int i = 0; i < n; i++){double[][] u = new double[m][1];for(int j = 0; j < m; j++)u[j][0] = matrix[j][i];for(int j = 0; j < i; j++) {double[][] q = new double[m][1];for(int k = 0; k < m; k++)q[k][0] = matrix[k][j];double r = matrixProduct(T(q), u)[0][0];u = matrixPlus(u, matrixNumProduct(r, q), false);R[j][i] = r;}double mode = 0;for(int j = 0; j < m; j++)mode += u[j][0]*u[j][0];double r = Math.pow(mode, 0.5);R[i][i] = r;u = matrixNumProduct(1/r, u);for(int j = 0; j < m; j++)matrix[j][i] = u[j][0];}outList.add(matrix);outList.add(R);return outList;}public static List<double[][]> GivensQR(double[][] matrix){int maxRow = matrix.length;int maxCol = matrix[0].length;int m = matrix.length;int n = matrix[0].length;List<double[][]> QList = new LinkedList<>();List<double[][]> RList = new LinkedList<>();List<double[][]> outList = new LinkedList<>();while(maxRow > 1 && maxCol > 1){int row = matrix.length;double[][] u = new double[row][1];for(int i = 0; i < row; i++)u[i][0] = matrix[i][0];List<double[][]> TList = new LinkedList<>();for(int i = 1; i < row; i++){if(Double.doubleToLongBits(u[i][0]) == Double.doubleToLongBits(0.00))continue;double c = u[0][0] / Math.pow((u[0][0]*u[0][0])+(u[i][0]*u[i][0]), 0.5);double s = u[i][0] / Math.pow((u[0][0]*u[0][0])+(u[i][0]*u[i][0]), 0.5);double[][] T = eye(row);T[0][0] = T[i][i] = c;T[0][i] = s;T[i][0] = -s;u = matrixProduct(T, u);TList.add(T);}double[][] T = ((LinkedList<double[][]>)TList).poll();while(!TList.isEmpty()){double[][] temp = ((LinkedList<double[][]>)TList).poll();T = matrixProduct(temp, T);}QList.add(T);RList.add(matrixProduct(T, matrix));matrix = nextStep(matrixProduct(T, matrix));maxCol --;maxRow --;}outList.add(T(repairQList(QList, m, n)));outList.add(repairRList(RList, m, n));return outList;}public static List<double[][]> HouseholdQR(double[][] matrix){int maxRow = matrix.length;int maxCol = matrix[0].length;int m = matrix.length;int n = matrix[0].length;List<double[][]> QList = new LinkedList<>();List<double[][]> RList = new LinkedList<>();List<double[][]> outList = new LinkedList<>();while(maxRow > 1 && maxCol > 1){int row = matrix.length;double[][] u = new double[row][1];for(int i = 0; i < row; i++)u[i][0] = matrix[i][0];double mode = 0;for(int i = 0; i < row; i++)mode += u[i][0]*u[i][0];mode = Math.pow(mode, 0.5);u[0][0] -= mode;double coff = 2 / matrixProduct(T(u),u)[0][0];double[][] R = matrixPlus(eye(row), matrixNumProduct(coff, matrixProduct(u, T(u))), false);double[][] mid = matrixProduct(R, matrix);QList.add(R);RList.add(mid);matrix = nextStep(mid);maxCol --;maxRow --;}outList.add(T(repairQList(QList, m, n)));outList.add(repairRList(RList, m, n));return outList;}private static double[][] matrixProduct(double[][] A, double[][] B){int y = A.length;int x = B[0].length;double C[][] = new double[y][x];for (int i = 0; i < y; i++)for (int j = 0; j < x; j++)for (int k = 0; k < B.length; k++)C[i][j] += A[i][k] * B[k][j];return C;}private static double[][] matrixPlus(double[][] A, double[][] B, boolean positive){int row = A.length;int col = A[0].length;double[][] C = new double[row][col];for(int i = 0; i < row; i++){for(int j = 0; j < col; j++){if(positive)C[i][j] = A[i][j] + B[i][j];elseC[i][j] = A[i][j] - B[i][j];}}return C;}private static double[][] matrixNumProduct(double b, double[][] A){int row = A.length;int col = A[0].length;double[][] C = new double[row][col];for(int i = 0; i < row; i++) {for (int j = 0; j < col; j++) {C[i][j] = b * A[i][j];}}return C;}private static double[][] repairQList(List<double[][]> QList, int m, int n){double[][] Q = ((LinkedList<double[][]>)QList).poll();while(!QList.isEmpty()){double[][] temp = ((LinkedList<double[][]>)QList).poll();int row = temp.length;int col = temp[0].length;double[][] productor = new double[m][n];for(int i = 0; i < row; i++)for (int j = 0; j < col; j++)productor[m-row+i][n-col+j] = temp[i][j];for(int i = 0; i < m-row; i++)productor[i][i] = 1;Q = matrixProduct(productor, Q);}return Q;}private static double[][] repairRList(List<double[][]> RList, int m, int n){double[][] R = ((LinkedList<double[][]>)RList).poll();while(!RList.isEmpty()){double[][] temp = ((LinkedList<double[][]>)RList).poll();int row = temp.length;int col = temp[0].length;for(int i = 0; i < row; i++)for (int j = 0; j < col; j++)R[m-row+i][n-col+j] = temp[i][j];}return R;}private static double[][] T(double[][] A){int row = A.length;int col = A[0].length;double[][] C = new double[col][row];for(int i = 0; i < col; i++) {for (int j = 0; j < row; j++) {C[i][j] = A[j][i];}}return C;}private static double[][] eye(int x){double[][] I = new double[x][x];for(int i = 0; i < x; i++)I[i][i] = 1;return I;}private static double[][] nextStep(double[][] A){int row = A.length;int col = A[0].length;double[][] C = new double[row-1][col-1];for(int i = 0; i < col-1; i++)for (int j = 0; j < row-1; j++)C[i][j] = A[i+1][j+1];return C;}private static int findExchange(double[][] matrix, int pivot){int length = matrix.length;double max = matrix[pivot][pivot];int out = pivot;for(int i = pivot; i < length; i++){if(absoluteValue(matrix[i][pivot]) > absoluteValue(max)){max = matrix[i][pivot];out = i;}}return out;}private static void exchange(double[][] matrix, double[][] L, int[]indexP, int i, int exchange){double[] temp = matrix[i];matrix[i] = matrix[exchange];matrix[exchange] = temp;double[] LTemp = L[i];L[i] = L[exchange];L[exchange] = LTemp;int tempIndex = indexP[i];indexP[i] = indexP[exchange];indexP[exchange] = tempIndex;}private static double eliminate(double[][] matrix, int i, int j){int length = matrix.length;double coefficient = matrix[j][i]/matrix[i][i];matrix[j][i] = 0;for(int k = i+1; k < length; k++)matrix[j][k] -= coefficient*matrix[i][k];return coefficient;}private static double absoluteValue(double x){return x >= 0 ? x : -x;}private static double[][] copy(double[][] matrix){int length = matrix.length;double[][] out = new double[length][length];for(int i = 0; i < length; i++)for(int j = 0; j < length; j++)out[i][j] = matrix[i][j];return out;}private static void print(double[][] matrix){int row = matrix.length;int col = matrix[0].length;for(int i = 0; i < row; i++) {for (int j = 0; j < col; j++) {BigDecimal bigDecimal = new BigDecimal(matrix[i][j]);String out = String.valueOf(bigDecimal.setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue());int add = 8 - out.length();for(int k = 0; k < add; k++)out += " ";System.out.print(out);}System.out.println();}}
}

LU分解(是/否部分主元法)+ 施密特(Schmidt)QR分解 + 吉文斯(Givens)QR分解 + Household QR分解 代码详解,可直接运行版本复测试用例(java8版)相关推荐

  1. 数学建模二:TOPSIS法(优劣解距离法) 附代码详解

    数学建模二:TOPSIS法(优劣解距离法)附代码详解 TOPSIS法(优劣解距离法)用于评价类问题. 层次分析法因为受限于一致性检验指标的数量,最多只能选择15个准则或方案.同时层次分析法也难以处理已 ...

  2. 量化延时法时间测量_干货分享:直线度测量发展及几种方法详解

    摘要:直线度是很多轧材需要检测的一项重要尺寸,直线度的测量已经从人工测量方式发展为直线度测量仪自动测量. 关键词:直线度:测量方式: 主要是测量圆柱体和圆锥体的素线直线度误差.机床和其他机器的导轨面以 ...

  3. 层次分析法2:Matlab实现层次分析法的代码详解

    目录 读取数据 读取准则层判断矩阵 读取方案层的判断矩阵 一致性检验 求解权重值 寻找权重值最高的结果 代码分享及注释 例题:挑选合适的工作,经双方恳谈,已有三个单位表示愿意录用某毕业生.该生根据已有 ...

  4. 从定积分定义到代码,详解矩形法求解定积分

    题目: 写一个函数用矩形求定积分的通用函数,分别别F(0,1) sinx dx,F(-1,1) cosx dx,F(0,2) exp(x) dx的定积分.(F(0,1)表示定积分的范围) 说明:sin ...

  5. 电荷负载分解(NILM)评价指标代码详解

    有关NILM中的评价指标的解释请看我们另外一篇博文 ,下面简单解释一下代码实现,代码为python版本. import numpy as npdef tp_tn_fp_fn(states_pred, ...

  6. 生产者(厨师做面条)消费者(吃货吃面条)模式synchronized 法和Lock+Condition法(不使用集合),代码详解

    1. synchronized + wait + notifyAll synchronized:包裹着同步代码块,代码块执行完释放锁 wait:线程挂起,失去锁 notifyAll:唤醒同个对象的wa ...

  7. [矩阵的QR分解系列一] 施密特(Schmidt)正交规范化

    施密特正交规范化 简介 规范化步骤 例子 引用 之前介绍的矩阵的三角分解系列介绍了利用矩阵初等变换解决了矩阵三角化问题以及具体的三角分解.但是以初等变换工具的三角分解方法并不能消除病态线性方程组不稳定 ...

  8. 单链表的头插法与尾插法代码实现及详解

    1. 头插法 2. 尾插法 3. 代码测试 1. 头插法   头插法: 从一个空表开始,重复读入数据,生成新结点,将读入数据存放到新结点的数据域中,然后将新结点插入到当前链表的表头结点之后,直到读入结 ...

  9. Python实现部分主元法下LU分解

    Python实现部分主元法下LU分解 ''' <矩阵分析与应用>小作业1 实现部分主元法下的LU分解 by苗栋 程序大体介绍: 引入了numpy便于对数组的操作 ①寻找出一列中绝对值最大的 ...

最新文章

  1. 8.2 高斯分布模型-机器学习笔记-斯坦福吴恩达教授
  2. pmp每日三题(2022年3月1日)
  3. 关于ie6下提交上传表单的注意事项
  4. 定义整型数组_C++数组的定义与初始化(学习笔记:第6章 01)
  5. 斜齿轮受力计算:理论计算virtual.lab motion 仿真
  6. 【PMP】Head First PMP 学习笔记 第十章 沟通管理
  7. synchronized的使用和底层原理、锁状态的膨胀升级过程
  8. python scheduler 定时执行_python使用apscheduler做定时任务的管理
  9. python读取csv文件
  10. c#读取csv到数组_C#读取CSV文件的方法
  11. poj 1328 贪心+qsort
  12. 元素内容必须由格式正确的字符数据或标记组成_字符编码是什么?html5如何设置字符编码?...
  13. efi分区咋移动到c盘里_曲线解决——用原版镜像中的diskpart命令创建efi分区,分区类型为主分区的原因...
  14. 实时工业以太网EtherCAT高速发展背后
  15. 题解-怪盗基德的滑翔翼 c++
  16. 怎么组建云计算中心?
  17. Nightmare Ⅱ(BFS)
  18. 安全基础--18--嵌入式基础之系统硬件
  19. 灰色关联度分析法(GRA)_python
  20. 从线性模型到广义线性模型(2)——参数估计、假设检验

热门文章

  1. GDUT 2.25 A
  2. Javaweb安全——Java动态代理
  3. 选择努力,就要不去放弃
  4. 计算机一级真题模拟试题,2016年3月计算机一级真题模拟试题及答案.doc
  5. 关于Redis的数据清理
  6. unity资源包分享
  7. 加密锁(加密狗)使用技巧
  8. selenium 无头模式
  9. 风火编程--python获取单只股票实时数据和历史数据
  10. 【资源】部分稀有资源