/* ## class NBanded ## ## This class holds the frame for matrices stored in banded form. ## It also contains the Gaussian routines for banded matrices. ## */ package edu.rice.linpack.Matrix.NMatrix; import edu.rice.linpack.LNumber.*; import edu.rice.linpack.util.*; public class NBanded extends NMatrix { protected int mu, ml; public NBanded() { super(); cons(); } public NBanded(int ML, int MU, int columns) { cons(2*ML+MU+1,columns); mu = MU; ml = ML; } // This is for unbanded LNumber arrays // public NBanded(LNumber[][] f, int ML, int MU) { mu = MU; ml = ML; Mat = band(f,ml,mu); rows = Mat.length; cols = Mat[0].length; pivot = new int[cols]; } // This is for banded LNumber arrays // public NBanded(LNumber[][] f, int ML) { cons(f); ml = ML; mu = f.length - 1 - 2*ML; } public NBanded(NFull F, int Ml, int Mu) { mu = Mu; ml = Ml; Mat = band(F.Mat,ml,mu); rows = Mat.length; cols = Mat[0].length; pivot = new int[cols]; } public NBanded(NBanded F) { mu = F.mu; ml = F.ml; rows = F.numofRows(); cols = F.numofCols(); pivot = new int[cols]; int M = ml+mu; Mat = new LNumber[rows][cols]; for(int j=0;j 0) hi = Math.min(rows,rows+M-j+1); else hi = rows; for(int i=low;i=i1 && k=Ml) Fband[k][j] = f[i][j]; else { LNumber T = f[0][0].Clone(); T.setZero(); Fband[k][j] = T; } } } } return Fband; } public NFull unband() { NFull Fband = new NFull(cols,cols); int M = ml + mu; for(int j=0;j=low && k=i1 && i=ml || Mat[j][i] != null) { Mat[j][i].Print(); System.out.print(" "); } else System.out.print("0.00 "); } else System.out.print("0.00 "); } System.out.println(); } System.out.println(); } public LNumber oneNorm() { int L = ml; int is = L + mu; LNumber anorm = this.asum(L+1,1,is,0); for(int j=0;j ml) is--; if(j < mu) L++; if(j >= cols-ml-1) L--; if(j < cols-1) anorm = anorm.max(this.asum(L+1,1,is,j+1)); } return anorm; } /* Pivots are java based */ public void factor() throws SingularMatrixException { int info = 0; int M = ml + mu + 1; LNumber T; int Ji = Math.min(cols,M) - 1; int io; for(int Jz=mu+1;Jz < Ji;Jz++) { io = M - 1 - Jz; for(int i=io;i < ml;i++) Mat[i][Jz].setZero(); } int Jz = Ji; int Ju = 0; /* Gaussian elimination with partial pivoting */ int colsm = cols - 1; if(cols > 1) { int kp; for(int k=0;k=0;k--) { int lm = Math.min(ml,cols-k-1); if(k < cols-1) Z[k].addTo(dot(lm,1,M+1,k,Z,1,k+1)); if((Z[k].abs()).greaterThan(1)) { LNumber S = (Z[k].abs()).invTo(); NUtil.scal(cols,S,Z,1); } int L = pivot[k]; NUtil.swapElems(Z,L,k); } LNumber S = (NUtil.asum(cols,Z,1)).invTo(); NUtil.scal(cols,S,Z,1); } private LNumber solveTransLY(int M, LNumber[] Z) { LNumber ynorm = Z[0].abs(); ynorm.setOne(); for(int k=0;k=0;k--) { if((Z[k].abs()).greaterThan(Mat[M][k].abs())) { LNumber S = (Mat[M][k].abs()).div(Z[k].abs()); NUtil.scal(cols,S,Z,1); ynorm.multTo(S); } if(!Mat[M][k].equals(0)) Z[k].divTo(Mat[M][k]); else Z[k].setOne(); int lm = Math.min(k,M); int la = M - lm; int lz = k - lm; LNumber T = Z[k].negate(); this.axpy(lm,T,1,la,k,Z,1,lz); } LNumber S = (NUtil.asum(cols,Z,1)).invTo(); NUtil.scal(cols,S,Z,1); ynorm.multTo(S); return ynorm; } public void solve(LNumber[] B) { this.solve(B,0); } public void solve(LNumber[] B, int Job) { int M = mu+ml+1; int nm = cols-1; LNumber T; if(Job == 0) { if(ml != 0) { if(nm > 0) { for(int k=0;k=0;k--) { int lm = Math.min(ml,nm-k); B[k] = B[k].add(dot(lm,1,M,k,B,1,k+1)); int l = pivot[k]; if(l != k) NUtil.swapElems(B,l,k); } } } return; } void solveTransRY(int M, LNumber[] B) { for(int k=0;k=0;k--) { int LM = Math.min(k,M); int la = M - LM; int lb = k - LM; B[k].divTo(Mat[M][k]); this.axpy(LM,B[k].negate(),1,la,k,B,1,lb); } } public LNumber[] determ() { LNumber[] Det = new LNumber[2]; int M = mu + ml; Det[0] = Mat[M][0].Clone(); Det[1] = Det[0].Clone(); Det[0].setOne(); Det[1].setZero(); for(int i=0;i