mirror of
https://github.com/gonum/gonum.git
synced 2025-10-06 07:37:03 +08:00
mat: add NonZeroDoer interfaces and implementations
Also clean up some documentation and missing type checks related to tests for NonZeroDoers.
This commit is contained in:
@@ -16,6 +16,10 @@ var (
|
||||
_ Banded = symBandDense
|
||||
_ RawSymBander = symBandDense
|
||||
_ MutableSymBanded = symBandDense
|
||||
|
||||
_ NonZeroDoer = symBandDense
|
||||
_ RowNonZeroDoer = symBandDense
|
||||
_ ColNonZeroDoer = symBandDense
|
||||
)
|
||||
|
||||
// SymBandDense represents a symmetric band matrix in dense storage format.
|
||||
@@ -41,7 +45,7 @@ type RawSymBander interface {
|
||||
// NewSymBandDense creates a new SymBand matrix with n rows and columns. If data == nil,
|
||||
// a new slice is allocated for the backing slice. If len(data) == n*(k+1),
|
||||
// data is used as the backing slice, and changes to the elements of the returned
|
||||
// BandDense will be reflected in data. If neither of these is true, NewSymBandDense
|
||||
// SymBandDense will be reflected in data. If neither of these is true, NewSymBandDense
|
||||
// will panic. k must be at least zero and less than n, otherwise NewBandDense will panic.
|
||||
//
|
||||
// The data must be arranged in row-major order constructed by removing the zeros
|
||||
@@ -126,3 +130,46 @@ func (s *SymBandDense) TBand() Banded {
|
||||
func (s *SymBandDense) RawSymBand() blas64.SymmetricBand {
|
||||
return s.mat
|
||||
}
|
||||
|
||||
// DoNonZero calls the function fn for each of the non-zero elements of s. The function fn
|
||||
// takes a row/column index and the element value of s at (i, j).
|
||||
func (s *SymBandDense) DoNonZero(fn func(i, j int, v float64)) {
|
||||
for i := 0; i < s.mat.N; i++ {
|
||||
for j := max(0, i-s.mat.K); j < min(s.mat.N, i+s.mat.K+1); j++ {
|
||||
v := s.at(i, j)
|
||||
if v != 0 {
|
||||
fn(i, j, v)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// DoRowNonZero calls the function fn for each of the non-zero elements of row i of s. The function fn
|
||||
// takes a row/column index and the element value of s at (i, j).
|
||||
func (s *SymBandDense) DoRowNonZero(i int, fn func(i, j int, v float64)) {
|
||||
if i < 0 || s.mat.N <= i {
|
||||
panic(ErrRowAccess)
|
||||
}
|
||||
for j := max(0, i-s.mat.K); j < min(s.mat.N, i+s.mat.K+1); j++ {
|
||||
v := s.at(i, j)
|
||||
if v != 0 {
|
||||
fn(i, j, v)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// DoColNonZero calls the function fn for each of the non-zero elements of column j of s. The function fn
|
||||
// takes a row/column index and the element value of s at (i, j).
|
||||
func (s *SymBandDense) DoColNonZero(j int, fn func(i, j int, v float64)) {
|
||||
if j < 0 || s.mat.N <= j {
|
||||
panic(ErrColAccess)
|
||||
}
|
||||
for i := 0; i < s.mat.N; i++ {
|
||||
if i-s.mat.K <= j && j < i+s.mat.K+1 {
|
||||
v := s.at(i, j)
|
||||
if v != 0 {
|
||||
fn(i, j, v)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user