#include <cstdio>
 #include <cstdlib>
 #include <algorithm>
 #include <cmath>
 #include <cassert>
 #include <vector>
 #include <ctime>

 class MclVector
 {
 public:
     int n;
     double *Mat;
     /**
       type=0: 列向量(默认)
       type=1: 行向量
     **/
     int type;

     MclVector() { Mat=NULL; n=; }
     MclVector(int len,double initVal=0.0)
     {
         n=len;
         Mat=];
         ;i<=n;i++) Mat[i]=initVal;
         type=;
     }

     double operator[](int id) const
     {
         return Mat[id];
     }

     double& operator[](int id)
     {
         return Mat[id];
     }

     double length() const
     {
         ;
         ;i<=n;i++) sum+=Mat[i]*Mat[i];
         return sqrt(sum);
     }

     MclVector operator*(double val) const
     {
         MclVector ans=MclVector(n);
         ;i<=n;i++) ans[i]=Mat[i]*val;
         return ans;
     }

     MclVector operator/(double val) const
     {
         MclVector ans=MclVector(n);
         ;i<=n;i++) ans[i]=Mat[i]/val;
         return ans;
     }

     MclVector operator+(const MclVector &newVector) const
     {
         MclVector ans=MclVector(n);
         ;i<=n;i++) ans[i]=Mat[i]+newVector[i];
         return ans;
     }

     MclVector operator-(const MclVector &newVector) const
     {
         MclVector ans=MclVector(n);
         ;i<=n;i++) ans[i]=Mat[i]-newVector[i];
         return ans;
     }

     MclVector operator*=(double val)
     {
         ;i<=n;i++) Mat[i]=Mat[i]*val;
         return *this;
     }

     MclVector operator/=(double val)
     {
         ;i<=n;i++) Mat[i]=Mat[i]/val;
         return *this;
     }

     MclVector operator+=(const MclVector &newVector)
     {
         ;i<=n;i++) Mat[i]+=newVector[i];
         return *this;
     }

     MclVector operator-=(const MclVector &newVector)
     {
         ;i<=n;i++) Mat[i]-=newVector[i];
         return *this;
     }

     MclVector GetTranspose() const
     {
         MclVector ans=*this;
         ans.type=;
         return ans;
     }

     void print() const
     {
         ;i<=n;i++) printf("%8.3lf ",Mat[i]);
         puts("");
     }

 };

 class MclMatrix
 {
 public:
     int row,col;
     MclVector *Mat;

     MclMatrix() {Mat=NULL;}
     MclMatrix(int _row,int _col,double initVal=0.0)
     {
         row=_row;
         col=_col;
         Mat=];
         ;i<=row;i++) Mat[i]=MclVector(col,initVal);
     }

     void setIdentityMatrix()
     {
         ;i<=row;i++)
         {
             ;j<=col;j++)
             {
                 ;
                 ;
             }
         }
     }

     MclMatrix GetTranspose() const
     {
         MclMatrix ans=MclMatrix(col,row);
         ;i<=ans.row;i++)
         {
             ;j<=ans.col;j++)
             {
                 ans[i][j]=Mat[j][i];
             }
         }
         return ans;
     }

     void print() const
     {
         ;i<=row;i++) Mat[i].print();
         puts("");
     }

     MclVector& operator[](int id) const
     {
         return Mat[id];
     }

     MclVector& operator[](int id)
     {
         return Mat[id];
     }

     MclMatrix operator*(const MclMatrix &Matrix) const
     {
         MclMatrix ans=MclMatrix(row,Matrix.col);
         ;i<=row;i++)
         {
             ;j<=Matrix.col;j++)
             {
                 ;k<=col;k++)
                 {
                     ans[i][j]+=Mat[i][k]*Matrix[k][j];
                 }
             }
         }
         return ans;
     }

     MclMatrix operator+(const MclMatrix &Matrix) const
     {
         MclMatrix ans=MclMatrix(row,Matrix.col);
         ;i<=row;i++)
         {
             ;j<=Matrix.col;j++)
             {
                 ans[i][j]=Mat[i][j]+Matrix[i][j];
             }
         }
         return ans;
     }

     MclMatrix operator-(const MclMatrix &Matrix) const
     {
         MclMatrix ans=MclMatrix(row,Matrix.col);
         ;i<=row;i++)
         {
             ;j<=Matrix.col;j++)
             {
                 ans[i][j]=Mat[i][j]-Matrix[i][j];
             }
         }
         return ans;
     }

     MclVector GetCol(int colId) const
     {
         MclVector ans=MclVector(row);
         ;i<=row;i++) ans[i]=Mat[i][colId];
         return ans;
     }
     MclVector GetRow(int rowId) const
     {
         MclVector ans=MclVector(row);
         ;i<=col;i++) ans[i]=Mat[rowId][i];
         return ans;
     }

     MclMatrix operator*=(const MclMatrix &Matrix)
     {
         return *this=*this*Matrix;
     }
     MclMatrix operator+=(const MclMatrix &Matrix)
     {
         return *this=*this+Matrix;
     }
     MclMatrix operator-=(const MclMatrix &Matrix)
     {
         return *this=*this-Matrix;
     }

     MclMatrix operator*(double x) const
     {
         MclMatrix ans=*this;
         ;i<=row;i++)
         {
             ;j<=col;j++)
             {
                 ans[i][j]*=x;
             }
         }
         return ans;
     }

 };

 MclMatrix vectorMulVector(const MclVector &A,const MclVector& B)
 {
     )
     {
         MclMatrix ans=MclMatrix(A.n,B.n);
         ;i<=A.n;i++)
         {
             ;j<=B.n;j++)
             {
                 ans[i][j]+=A[i]*B[j];
             }
         }
         return ans;
     }
     else
     {
         assert(A.n==B.n);
         MclMatrix ans=MclMatrix(,);
         ;i<=A.n;i++)
         {
             ans[][]+=A[i]*B[i];
         }
         return ans;
     }
 }

 int sgn(double x)
 {
     ;
     ;
     ;
 }

 /**
    矩阵的 Doolittle分解:
       [1] Mat是方阵
       [2] Mat的前n-1阶主子式行列式不为0
       [3] 分解的L为单位下三角阵
       [4] 分解的U为上三角阵
       [5] 返回值为<L,R>
 **/
 std::pair<MclMatrix,MclMatrix> DoolittleSplit(const MclMatrix &Mat)
 {
     int n=Mat.row;
     MclMatrix L=MclMatrix(n,n);
     MclMatrix U=MclMatrix(n,n);
     ;k<=n;k++)
     {
         for(int j=k;j<=n;j++)
         {
             U[k][j]=Mat[k][j];
             ;t<=k-;t++) U[k][j]-=L[k][t]*U[t][j];
         }
         if(k==n) continue;

         ;i<=n;i++)
         {
             L[i][k]=Mat[i][k];
             ;t<=k-;t++) L[i][k]-=L[i][t]*U[t][k];
             L[i][k]/=U[k][k];
         }
     }
     ;i<=n;i++) L[i][i]=;
     return std::make_pair(L,U);
 }

 /**
    三角矩阵分解:
       [1] Mat是方阵
       [2] j<i且i-j>r时 Mat[i][j]=0
       [2] j>i且j-i>s时 Mat[i][j]=0
 **/
 std::pair<MclMatrix,MclMatrix> TriangleSplit(const MclMatrix &Mat,int r,int s)
 {
     int n=Mat.row;
     MclMatrix L=MclMatrix(n,n);
     MclMatrix U=MclMatrix(n,n);
     ;k<=n;k++)
     {
         for(int j=k;j<=n;j++)
         {
             U[k][j]=Mat[k][j];
             ,std::max(k-r,j-s));t<=k-;t++) U[k][j]-=L[k][t]*U[t][j];
         }
         if(k==n) continue;

         ;i<=n;i++)
         {
             L[i][k]=Mat[i][k];
             ,std::max(i-r,k-s));t<=k-;t++) L[i][k]-=L[i][t]*U[t][k];
             L[i][k]/=U[k][k];
         }
     }
     ;i<=n;i++) L[i][i]=;
     return std::make_pair(L,U);
 }

 /**
   拟三对角矩阵分解
   对n=5 矩阵A样子如下:
       a1  c1  0   0  d1
       d2  a2  c2  0  0
       0   d3  a3  c3 0
       0   0   d4  a4 c4
       c5  0   0   d5 a5
    即输入为三个长度为n的向量

    A=LU
    L样子如下:
      p1  0  0  0  0
      d2  p2 0  0  0
      0   d3 p3 0  0
      0   0  d3 p4 0
      r1  r2 r3 r4 r5

    U样子如下:
      1  q1  0  0  s1
      0  1   q2 0  s2
      0  0   1  q3 s3
      0  0   0  1  s4
      0  0   0  0  1

     即将返回p,q,s,r四个向量(所有的向量长度都是n)
     vector[0]=p
     vector[1]=q
     vector[2]=s
     vector[3]=r
 **/

 std::vector<MclVector> QuasiDiagonalSplit(const MclVector &a,const MclVector &c,const MclVector &d)
 {
     int n=a.n;
     assert(c.n==n);
     assert(d.n==n);
     assert(n>);

     MclVector p=MclVector(n);
     MclVector q=MclVector(n);
     MclVector s=MclVector(n);
     MclVector r=MclVector(n);

     p[]=a[];
     ;i<=n-;i++)
     {
         q[i]=c[i]/p[i];
         p[i+]=a[i+]-d[i+]*q[i];
     }

     s[]=d[]/p[];
     ;i<=n-;i++) s[i]=-d[i]*s[i-]/p[i];
     s[n-]=(c[n-]-d[n-]*s[n-])/p[n-];

     r[]=c[n];
     ;j<=n-;j++) r[j]=-r[j-]*q[j-];
     r[n-]=d[n]-r[n-]*q[n-];
     r[n]=a[n];
     ;j<=n-;j++) r[n]=r[n]-r[j]*s[j];

     std::vector<MclVector> ans;
     ans.push_back(p);
     ans.push_back(q);
     ans.push_back(s);
     ans.push_back(r);

     return ans;
 }

Doolitter分解 三对角矩阵分解 拟三对角分解的更多相关文章

  1. 【矩阵】RQ/QR 分解

    Multiple View Geometry in Computer Vision A.4.1.1 (page 579) 将一个 3x3 矩阵 $ A $ 进行 RQ 分解是将其分解成为一个上三角阵 ...

  2. 矩阵的五种分解的matlab实现

    由于这学期修了矩阵分析这门课,课程要求用matlab实现矩阵的5种分解,仅仅是实现了分解,上传到博客存档,万一哪天某位同学就需要了呢.. 1.矩阵的满秩分解 代码实现 %矩阵的满秩分解 clear % ...

  3. 三对角矩阵(Tridiagonal Matrices)的求法:Thomas Algorithm(TDMA)

    转载http://www.cnblogs.com/xpvincent/archive/2013/01/25/2877411.html 做三次样条曲线时,需要解三对角矩阵(Tridiagonal Mat ...

  4. gemm() 与 gesvd() 到矩阵求逆(inverse)(根据 SVD 分解和矩阵乘法求矩阵的逆)

    可逆方阵 A 的逆记为,A−1,需满足 AA−1=I. 在 BLAS 的各种实现中,一般都不会直接给出 matrix inverse 的直接实现,其实矩阵(方阵)的逆是可以通过 gemm()和gesv ...

  5. 【matlab】 QR分解 求矩阵的特征值

    "QR_H.m" function [Q,R] = QR_tao(A) %输入矩阵A %输出正交矩阵Q和上三角矩阵R [n,n]=size(A); E = eye(n); X = ...

  6. 整数(质因子)分解(Pollard rho大整数分解)

    整数分解,又称质因子分解.在数学中,整数分解问题是指:给出一个正整数,将其写成几个素数的乘积的形式. (每个合数都可以写成几个质数相乘的形式,这几个质数就都叫做这个合数的质因数.) .试除法(适用于范 ...

  7. FZU 1075 分解素因子【数论/唯一分解定理/分解素因子裸模板】

    [唯一分解定理]:https://www.cnblogs.com/mjtcn/p/6743624.html 假设x是一个正整数,它的值不超过65535(即1<x<=65535),请编写一个 ...

  8. CodeForces - 24D :Broken robot (DP+三对角矩阵高斯消元 随机)

    pro:给定N*M的矩阵,以及初始玩家位置. 规定玩家每次会等概率的向左走,向右走,向下走,原地不动,问走到最后一行的期望.保留4位小数. sol:可以列出方程,高斯消元即可,发现是三角矩阵,O(N* ...

  9. Broken robot CodeForces - 24D (三对角矩阵简化高斯消元+概率dp)

    题意: 有一个N行M列的矩阵,机器人最初位于第i行和第j列.然后,机器人可以在每一步都转到另一个单元.目的是转到最底部(第N个)行.机器人可以停留在当前单元格处,向左移动,向右移动或移动到当前位置下方 ...

随机推荐

  1. 怎么配置Java环境变量?

    右键计算机 -> 属性 -> 高级系统设置 -> 环境变量,   在系统环境变量添加以下三条变量. 1. PATH, 配置JDK命令文件的位置. 输入“%JAVA_HOME%\bin ...

  2. find exec 运用

    实例1:ls -l命令放在find命令的-exec选项中 : find . -type f -exec ls -l {} \;  实例2:在目录中查找更改时间在n日以前的文件并删除它们: find . ...

  3. Struts2的Action(二)

    Struts2的Action可以是一个POJO(即简单的javaBean),也实现Action接口,或者继承ActionSupport类. 1.Action接口: public interface A ...

  4. requirejs解决异步模块加载方案

    他首先会遍历enableRegistry取出其中定义的模块,并且将没有加载成功的模块标识注入noLoads数组,如果过期了这里就会报错 如果上述没问题还会做循环依赖的判断,主要逻辑在breakCycl ...

  5. Java封装

    面向对象的三大特征:封装.继承.多态.封装在书面上来说,他无非就是set和get方法罢了.为什么要用到封装,比如买主机如果没有机箱只有内存条.CPU.主板等等那些零件买回到家,你还得一个个的去装那些零 ...

  6. saltstack学习

    1. 创建基础镜像 2. 创建配置文件 3. 启动容器 4. 检查创建是否成功 1. 创建基础镜像 salt-master, 文件名Dockerfile # VERSION 1.0 # TO_BUIL ...

  7. 淘宝天猫网站停止支持IE6、IE7浏览器,你还在用xp吗?

    2016年4月14日,是科比正式告别篮球的最后一场球赛.大家都在忙着各种纪念和怀念着看科比打球的青葱岁月.不过已经完美谢幕.而我们今天要说的是微软的IE6.IE7浏览器.淘宝网和天猫商城正式停止支持I ...

  8. 数据库表结构对比同步mysqldiff

    开发服务器的数据库表结构进行了修改,或者修改过多,为了与线上的数据库结构同步,可以使用mysqldiff工具对线上数据库打补丁. mysqldiff Windows下载地址:http://dev.my ...

  9. cookbook学习第二弹

    1.5怎样实现一个按优先级排序的队列?并且在这个队列上面每次pop操作总是返回优先级最高的那个元素 带有双下划线的方法,会在需要被调用的位置自动被调用 带有单下划线的变量是私有变量 下面利用类heap ...

  10. Linux modules install

    安装模块的时候出现错误:modprobe: chdir(3.0.35-g6774ed9-dirty): No such file or directory. 内核模块没有安装正确.本文记录解决方法. ...