github.com/jingcheng-WU/gonum@v0.9.1-0.20210323123734-f1a2a11a8f7b/mat/index_no_bound_checks.go (about) 1 // Copyright ©2014 The Gonum Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // This file must be kept in sync with index_bound_checks.go. 6 7 // +build !bounds 8 9 package mat 10 11 // At returns the element at row i, column j. 12 func (m *Dense) At(i, j int) float64 { 13 if uint(i) >= uint(m.mat.Rows) { 14 panic(ErrRowAccess) 15 } 16 if uint(j) >= uint(m.mat.Cols) { 17 panic(ErrColAccess) 18 } 19 return m.at(i, j) 20 } 21 22 func (m *Dense) at(i, j int) float64 { 23 return m.mat.Data[i*m.mat.Stride+j] 24 } 25 26 // Set sets the element at row i, column j to the value v. 27 func (m *Dense) Set(i, j int, v float64) { 28 if uint(i) >= uint(m.mat.Rows) { 29 panic(ErrRowAccess) 30 } 31 if uint(j) >= uint(m.mat.Cols) { 32 panic(ErrColAccess) 33 } 34 m.set(i, j, v) 35 } 36 37 func (m *Dense) set(i, j int, v float64) { 38 m.mat.Data[i*m.mat.Stride+j] = v 39 } 40 41 // At returns the element at row i, column j. 42 func (m *CDense) At(i, j int) complex128 { 43 if uint(i) >= uint(m.mat.Rows) { 44 panic(ErrRowAccess) 45 } 46 if uint(j) >= uint(m.mat.Cols) { 47 panic(ErrColAccess) 48 } 49 return m.at(i, j) 50 } 51 52 func (m *CDense) at(i, j int) complex128 { 53 return m.mat.Data[i*m.mat.Stride+j] 54 } 55 56 // Set sets the element at row i, column j to the value v. 57 func (m *CDense) Set(i, j int, v complex128) { 58 if uint(i) >= uint(m.mat.Rows) { 59 panic(ErrRowAccess) 60 } 61 if uint(j) >= uint(m.mat.Cols) { 62 panic(ErrColAccess) 63 } 64 m.set(i, j, v) 65 } 66 67 func (m *CDense) set(i, j int, v complex128) { 68 m.mat.Data[i*m.mat.Stride+j] = v 69 } 70 71 // At returns the element at row i. 72 // It panics if i is out of bounds or if j is not zero. 73 func (v *VecDense) At(i, j int) float64 { 74 if uint(i) >= uint(v.mat.N) { 75 panic(ErrRowAccess) 76 } 77 if j != 0 { 78 panic(ErrColAccess) 79 } 80 return v.at(i) 81 } 82 83 // AtVec returns the element at row i. 84 // It panics if i is out of bounds. 85 func (v *VecDense) AtVec(i int) float64 { 86 if uint(i) >= uint(v.mat.N) { 87 panic(ErrRowAccess) 88 } 89 return v.at(i) 90 } 91 92 func (v *VecDense) at(i int) float64 { 93 return v.mat.Data[i*v.mat.Inc] 94 } 95 96 // SetVec sets the element at row i to the value val. 97 // It panics if i is out of bounds. 98 func (v *VecDense) SetVec(i int, val float64) { 99 if uint(i) >= uint(v.mat.N) { 100 panic(ErrVectorAccess) 101 } 102 v.setVec(i, val) 103 } 104 105 func (v *VecDense) setVec(i int, val float64) { 106 v.mat.Data[i*v.mat.Inc] = val 107 } 108 109 // At returns the element at row i and column j. 110 func (s *SymDense) At(i, j int) float64 { 111 if uint(i) >= uint(s.mat.N) { 112 panic(ErrRowAccess) 113 } 114 if uint(j) >= uint(s.mat.N) { 115 panic(ErrColAccess) 116 } 117 return s.at(i, j) 118 } 119 120 func (s *SymDense) at(i, j int) float64 { 121 if i > j { 122 i, j = j, i 123 } 124 return s.mat.Data[i*s.mat.Stride+j] 125 } 126 127 // SetSym sets the elements at (i,j) and (j,i) to the value v. 128 func (s *SymDense) SetSym(i, j int, v float64) { 129 if uint(i) >= uint(s.mat.N) { 130 panic(ErrRowAccess) 131 } 132 if uint(j) >= uint(s.mat.N) { 133 panic(ErrColAccess) 134 } 135 s.set(i, j, v) 136 } 137 138 func (s *SymDense) set(i, j int, v float64) { 139 if i > j { 140 i, j = j, i 141 } 142 s.mat.Data[i*s.mat.Stride+j] = v 143 } 144 145 // At returns the element at row i, column j. 146 func (t *TriDense) At(i, j int) float64 { 147 if uint(i) >= uint(t.mat.N) { 148 panic(ErrRowAccess) 149 } 150 if uint(j) >= uint(t.mat.N) { 151 panic(ErrColAccess) 152 } 153 return t.at(i, j) 154 } 155 156 func (t *TriDense) at(i, j int) float64 { 157 isUpper := t.triKind() 158 if (isUpper && i > j) || (!isUpper && i < j) { 159 return 0 160 } 161 return t.mat.Data[i*t.mat.Stride+j] 162 } 163 164 // SetTri sets the element at row i, column j to the value v. 165 // It panics if the location is outside the appropriate half of the matrix. 166 func (t *TriDense) SetTri(i, j int, v float64) { 167 if uint(i) >= uint(t.mat.N) { 168 panic(ErrRowAccess) 169 } 170 if uint(j) >= uint(t.mat.N) { 171 panic(ErrColAccess) 172 } 173 isUpper := t.isUpper() 174 if (isUpper && i > j) || (!isUpper && i < j) { 175 panic(ErrTriangleSet) 176 } 177 t.set(i, j, v) 178 } 179 180 func (t *TriDense) set(i, j int, v float64) { 181 t.mat.Data[i*t.mat.Stride+j] = v 182 } 183 184 // At returns the element at row i, column j. 185 func (b *BandDense) At(i, j int) float64 { 186 if uint(i) >= uint(b.mat.Rows) { 187 panic(ErrRowAccess) 188 } 189 if uint(j) >= uint(b.mat.Cols) { 190 panic(ErrColAccess) 191 } 192 return b.at(i, j) 193 } 194 195 func (b *BandDense) at(i, j int) float64 { 196 pj := j + b.mat.KL - i 197 if pj < 0 || b.mat.KL+b.mat.KU+1 <= pj { 198 return 0 199 } 200 return b.mat.Data[i*b.mat.Stride+pj] 201 } 202 203 // SetBand sets the element at row i, column j to the value v. 204 // It panics if the location is outside the appropriate region of the matrix. 205 func (b *BandDense) SetBand(i, j int, v float64) { 206 if uint(i) >= uint(b.mat.Rows) { 207 panic(ErrRowAccess) 208 } 209 if uint(j) >= uint(b.mat.Cols) { 210 panic(ErrColAccess) 211 } 212 pj := j + b.mat.KL - i 213 if pj < 0 || b.mat.KL+b.mat.KU+1 <= pj { 214 panic(ErrBandSet) 215 } 216 b.set(i, j, v) 217 } 218 219 func (b *BandDense) set(i, j int, v float64) { 220 pj := j + b.mat.KL - i 221 b.mat.Data[i*b.mat.Stride+pj] = v 222 } 223 224 // At returns the element at row i, column j. 225 func (s *SymBandDense) At(i, j int) float64 { 226 if uint(i) >= uint(s.mat.N) { 227 panic(ErrRowAccess) 228 } 229 if uint(j) >= uint(s.mat.N) { 230 panic(ErrColAccess) 231 } 232 return s.at(i, j) 233 } 234 235 func (s *SymBandDense) at(i, j int) float64 { 236 if i > j { 237 i, j = j, i 238 } 239 pj := j - i 240 if s.mat.K+1 <= pj { 241 return 0 242 } 243 return s.mat.Data[i*s.mat.Stride+pj] 244 } 245 246 // SetSymBand sets the element at row i, column j to the value v. 247 // It panics if the location is outside the appropriate region of the matrix. 248 func (s *SymBandDense) SetSymBand(i, j int, v float64) { 249 if uint(i) >= uint(s.mat.N) { 250 panic(ErrRowAccess) 251 } 252 if uint(j) >= uint(s.mat.N) { 253 panic(ErrColAccess) 254 } 255 s.set(i, j, v) 256 } 257 258 func (s *SymBandDense) set(i, j int, v float64) { 259 if i > j { 260 i, j = j, i 261 } 262 pj := j - i 263 if s.mat.K+1 <= pj { 264 panic(ErrBandSet) 265 } 266 s.mat.Data[i*s.mat.Stride+pj] = v 267 } 268 269 func (t *TriBandDense) At(i, j int) float64 { 270 if uint(i) >= uint(t.mat.N) { 271 panic(ErrRowAccess) 272 } 273 if uint(j) >= uint(t.mat.N) { 274 panic(ErrColAccess) 275 } 276 return t.at(i, j) 277 } 278 279 func (t *TriBandDense) at(i, j int) float64 { 280 // TODO(btracey): Support Diag field, see #692. 281 isUpper := t.isUpper() 282 if (isUpper && i > j) || (!isUpper && i < j) { 283 return 0 284 } 285 kl := t.mat.K 286 ku := 0 287 if isUpper { 288 ku = t.mat.K 289 kl = 0 290 } 291 pj := j + kl - i 292 if pj < 0 || kl+ku+1 <= pj { 293 return 0 294 } 295 return t.mat.Data[i*t.mat.Stride+pj] 296 } 297 298 func (t *TriBandDense) SetTriBand(i, j int, v float64) { 299 if uint(i) >= uint(t.mat.N) { 300 panic(ErrRowAccess) 301 } 302 if uint(j) >= uint(t.mat.N) { 303 panic(ErrColAccess) 304 } 305 isUpper := t.isUpper() 306 if (isUpper && i > j) || (!isUpper && i < j) { 307 panic(ErrTriangleSet) 308 } 309 kl, ku := t.mat.K, 0 310 if isUpper { 311 kl, ku = 0, t.mat.K 312 } 313 pj := j + kl - i 314 if pj < 0 || kl+ku+1 <= pj { 315 panic(ErrBandSet) 316 } 317 // TODO(btracey): Support Diag field, see #692. 318 t.mat.Data[i*t.mat.Stride+pj] = v 319 } 320 321 func (t *TriBandDense) setTriBand(i, j int, v float64) { 322 var kl int 323 if !t.isUpper() { 324 kl = t.mat.K 325 } 326 pj := j + kl - i 327 t.mat.Data[i*t.mat.Stride+pj] = v 328 } 329 330 // At returns the element at row i, column j. 331 func (d *DiagDense) At(i, j int) float64 { 332 if uint(i) >= uint(d.mat.N) { 333 panic(ErrRowAccess) 334 } 335 if uint(j) >= uint(d.mat.N) { 336 panic(ErrColAccess) 337 } 338 return d.at(i, j) 339 } 340 341 func (d *DiagDense) at(i, j int) float64 { 342 if i != j { 343 return 0 344 } 345 return d.mat.Data[i*d.mat.Inc] 346 } 347 348 // SetDiag sets the element at row i, column i to the value v. 349 // It panics if the location is outside the appropriate region of the matrix. 350 func (d *DiagDense) SetDiag(i int, v float64) { 351 if uint(i) >= uint(d.mat.N) { 352 panic(ErrRowAccess) 353 } 354 d.setDiag(i, v) 355 } 356 357 func (d *DiagDense) setDiag(i int, v float64) { 358 d.mat.Data[i*d.mat.Inc] = v 359 }