001 package numal.lowprecision; 002 003 import static java.lang.Math.*; 004 005 /** A library of basic operations between matrices and vectrors. 006 * These methods make use of lower and upper indices; which allows 007 * vectors to be 0-index or 1-index (i.e. a[0...n-1] or a[1...n]) 008 */ 009 010 public class Basic extends Object { 011 012 static final int BASE = 100; 013 014 /** Compute a constant multiple (<i>x</i) of part of a vector <i>b</i>. 015 * Method originally from class numal.LinearAlgebra - Lau (2004) 016 * section 1.2.A Real vector and matrix - Duplication p.6. 017 * 018 * @param l lower row bound index 019 * @param u upper row bound index 020 * @param shift index shifting parameter 021 * @param a rectangular output matrix 022 * @param b rectangular input matrix 023 */ 024 025 public static void dupvec(int l, int u, int shift, float a[], float b[]) { 026 for (int k = l; k <= u; k++) a[k] = b[k + shift]; 027 } 028 029 /** Replace a column sequence of elements of a rectangular matrix <i>a</i> 030 * by a constant multiple (<i>x</i) of a column sequence of elements of a rectangular matrix <i>b</i>. 031 * Method originally from class numal.LinearAlgebra - Lau (2004) 032 * section 1.3.C Real vector and matrix - Multiplication p.9. 033 * 034 * @param l lower row bound 035 * @param u upper row bound 036 * @param i column index of <i>a</i> 037 * @param j column index of <i>b</i> 038 * @param a rectangular matrix 039 * @param b rectangular matrix 040 * @param x multiplication factor 041 */ 042 public static void mulcol(int l, int u, int i, int j, float a[][], float b[][], float x) { 043 for (int k = l; k <= u; k++) a[k][i] = x * b[k][j]; 044 } 045 046 /** Compute the inner product of part of a vector <i>a</i> and part of a vector <i>b</i> 047 * A subset of the inner product 048 * can be computed by choosing suitable lower and upper bounds. 049 * Method originally from class numal.Basic - Lau (2004) 050 * section 1.4.A Real vector vector products p.10. 051 * 052 * @param l lower bound 053 * @param u upper bound 054 * @param shift index-shifting parameter of vector <i>b</i> 055 * @param a vector 056 * @param b vector 057 * @return the inner product of vector <i>a</i> and vector <i>b</i> 058 */ 059 public static float vecvec(int l, int u, int shift, float a[], float b[]) { 060 float s = 0f; 061 for (int k = l; k <= u; k++) s += a[k] * b[k + shift]; 062 return s; 063 } 064 065 /** Compute the inner product of part of a row of a rectangular matrix <i>a</i> 066 * and the corresponding part of a vector <i>b</i>. A subset of the inner product 067 * can be computed by choosing suitable lower and upper column bounds. 068 * Method originally from class numal.Basic - Lau (2004) 069 * section 1.4.B Real Vector Vector products p.11. 070 * 071 * @param l lower bound 072 * @param u upper bound 073 * @param i row index of <i>a</i> 074 * @param a rectangular matrix 075 * @param b vector 076 * @return inner product of row <i>i</i> of matrix <i>a</i> with vector <i>b</i> 077 */ 078 public static float matvec(int l, int u, int i, float a[][], float b[]) { 079 float s = 0f; 080 for (int k = l; k <= u; k++) s += a[i][k] * b[k]; 081 return s; 082 } 083 /** 084 * Method originally from class numal.Basic - Lau (2004) 085 * section 1.4.B Real Vector Vector products p.12. 086 * @param l lower bound 087 * @param u upper bound 088 * @param i column index of <i>a</i> 089 * @param a rectangular matrix with column [l-u][j] defined 090 * @param b vector with entries [l-u] defined 091 */ 092 093 public static float tamvec(int l, int u, int i, float a[][], float b[]) { 094 float s = 0f; 095 for (int k = l; k <= u; k++) s += a[k][i] * b[k]; 096 return s; 097 } 098 099 /** Get the inner product of part of a row of a rectangular matrix <i>a</i> 100 * and the corresponding part of a column of a rectangular matrix <i>b</i>. 101 * 102 * @param l lower row bound 103 * @param u upper row bound 104 * @param i row index of <i>a</i> 105 * @param j column index of <i>b</i> 106 * @param a rectangular matrix with row [i][l-u] defined 107 * @param b rectangular matrix with column [l-u][j] defined 108 * 109 * @return inner product of <i>a</i> and <i>b</i> 110 */ 111 public static float matmat(int l, int u, int i, int j, float a[][], float b[][]) { 112 float s = 0f; 113 for (int k = l; k <= u; k++) s += a[i][k] * b[k][j]; 114 return s; 115 } 116 117 /** Compute the inner product of part of a column of a rectangular matrix <i>a</i> 118 * and the corresponding part of a column of a rectangular matrix <i>b</i>. 119 * Method originally from class numal.Basic - Lau (2004) 120 * section 1.4.E Real Vector Vector products p.13. 121 * 122 * @param l lower row bound 123 * @param u upper row bound 124 * @param i column index of <i>a</i> 125 * @param j column index of <i>b</i> 126 * @param a rectangular matrix with column [l-u][i] defined 127 * @param b rectangular matrix with column [l-u][j] defined 128 */ 129 public static float tammat(int l, int u, int i, int j, float a[][], float b[][]) { 130 float s = 0f; 131 for (int k = l; k <= u; k++) s += a[k][i] * b[k][j]; 132 return s; 133 } 134 135 /** Compute the inner product of part of a row of a rectangular matrix <i>a</i> and the 136 * corresponding part of a row of a rectangular matrix <i>b</i>. 137 * Method originally from class numal.LinearAlgebra - Lau (2004) 138 * section 1.4.F Real Vector Vector products p.13 139 * 140 * @param l lower column bound 141 * @param u upper column bound 142 * @param i row index of <i>a</i> 143 * @param j row index of <i>b</i> 144 * @param a rectangular matrix 145 * @param b rectangular matrix 146 * @return inner product of row <i>i</i> of <i>a</i> and row <i>j</i> of <i>b</i> 147 */ 148 public static float mattam(int l, int u, int i, int j, float a[][], float b[][]) { 149 float s = 0f; 150 for (int k = l; k <= u; k++) s += a[i][k] * b[j][k]; 151 return s; 152 } 153 154 /** Adds a constant multiple (<i>x</i>) of part of a column of a rectangular matrix 155 * <i>b</i> to part of a column of a rectangular matrix <i>a</i> 156 * Method originally from class numal.Basic - Lau (2004) 157 * section 1.7.B Real vector and matrix - Elimination p.22. 158 * 159 * @param l lower row bound 160 * @param u upper row bound 161 * @param i column index of <i>a</i> 162 * @param j column index of <i>b</i> 163 * @param a rectangular matrix 164 * @param b rectangular matrix 165 * @param x multiplication factor 166 */ 167 public static void elmcol(int l, int u, int i, int j, float a[][], float b[][], float x) { 168 for (int k = l; k <= u; k++) a[k][i] += x * b[k][j]; 169 } 170 171 /** Adds a constant multiple (<i>x</i>) of part of a row of a rectangular matrix 172 * <i>b</i> to part of a row of a rectangular matrix <i>a</i> 173 * Method originally from class numal.Basic - Lau (2004) 174 * section 1.7.B Real vector and matrix - Elimination p.22. 175 * 176 * @param l lower row bound 177 * @param u upper row bound 178 * @param i column index of <i>a</i> 179 * @param j column index of <i>b</i> 180 * @param a rectangular matrix 181 * @param b rectangular matrix 182 * @param x multiplication factor 183 */ 184 public static void elmrow(int l, int u, int i, int j, float a[][], float b[][], float x) { 185 for (int k = l; k <= u; k++) a[i][k] += x * b[j][k]; 186 } 187 188 /** Rotates two columns of a rectangular matrix using two parameters 189 * <ul> 190 * <li>a[k][i] = c * a[k][i] + s * a[k][j] (where k = l to u)</li> 191 * <li>a[k][j] = c * a[k][j] - s * a[k][i]</li> 192 * </ul> 193 * Method originally from class numal.Basic - Lau (2004) 194 * section 1.9.A Real vector and matrix - Rotation p.30. 195 * 196 * @param l lower row bound 197 * @param u upper row bound 198 * @param i column index of <i>a</i> 199 * @param j column index of <i>a</i> 200 * @param a rectangular matrix 201 * @param c cosine multiplication parameter 202 * @param s sine multiplication parameter 203 */ 204 public static void rotcol(int l, int u, int i, int j, float a[][], float c, float s) { 205 for (int k = l; k <= u; k++) { 206 float x = a[k][i]; 207 float y = a[k][j]; 208 a[k][i] = x * c + y * s; 209 a[k][j] = y * c - x * s; 210 } 211 } 212 213 }