mirror of
https://github.com/gonum/gonum.git
synced 2025-10-18 21:15:23 +08:00
mat: extend Vector slicing sematics to allow slicing up to capacity
This commit is contained in:
@@ -49,10 +49,10 @@ func NewVector(n int, data []float64) *Vector {
|
|||||||
|
|
||||||
// SliceVec returns a new Vector that shares backing data with the receiver.
|
// SliceVec returns a new Vector that shares backing data with the receiver.
|
||||||
// The returned matrix starts at i of the receiver and extends k-i elements.
|
// The returned matrix starts at i of the receiver and extends k-i elements.
|
||||||
// SliceVec panics with ErrIndexOutOfRange if the slice is outside the bounds
|
// SliceVec panics with ErrIndexOutOfRange if the slice is outside the capacity
|
||||||
// of the receiver.
|
// of the receiver.
|
||||||
func (v *Vector) SliceVec(i, k int) *Vector {
|
func (v *Vector) SliceVec(i, k int) *Vector {
|
||||||
if i < 0 || k <= i || v.n < k {
|
if i < 0 || k <= i || v.Cap() < k {
|
||||||
panic(ErrIndexOutOfRange)
|
panic(ErrIndexOutOfRange)
|
||||||
}
|
}
|
||||||
return &Vector{
|
return &Vector{
|
||||||
@@ -64,7 +64,8 @@ func (v *Vector) SliceVec(i, k int) *Vector {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Dims returns the number of rows and columns in the matrix. Columns is always 1.
|
// Dims returns the number of rows and columns in the matrix. Columns is always 1
|
||||||
|
// for a non-Reset vector.
|
||||||
func (v *Vector) Dims() (r, c int) {
|
func (v *Vector) Dims() (r, c int) {
|
||||||
if v.isZero() {
|
if v.isZero() {
|
||||||
return 0, 0
|
return 0, 0
|
||||||
@@ -72,11 +73,28 @@ func (v *Vector) Dims() (r, c int) {
|
|||||||
return v.n, 1
|
return v.n, 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Caps returns the number of rows and columns in the backing matrix. Columns is always 1
|
||||||
|
// for a non-Reset vector.
|
||||||
|
func (v *Vector) Caps() (r, c int) {
|
||||||
|
if v.isZero() {
|
||||||
|
return 0, 0
|
||||||
|
}
|
||||||
|
return v.Cap(), 1
|
||||||
|
}
|
||||||
|
|
||||||
// Len returns the length of the vector.
|
// Len returns the length of the vector.
|
||||||
func (v *Vector) Len() int {
|
func (v *Vector) Len() int {
|
||||||
return v.n
|
return v.n
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Cap returns the capacity of the vector.
|
||||||
|
func (v *Vector) Cap() int {
|
||||||
|
if v.isZero() {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
return (cap(v.mat.Data)-1)/v.mat.Inc + 1
|
||||||
|
}
|
||||||
|
|
||||||
// T performs an implicit transpose by returning the receiver inside a Transpose.
|
// T performs an implicit transpose by returning the receiver inside a Transpose.
|
||||||
func (v *Vector) T() Matrix {
|
func (v *Vector) T() Matrix {
|
||||||
return Transpose{v}
|
return Transpose{v}
|
||||||
|
@@ -51,6 +51,70 @@ func TestNewVector(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestCap(t *testing.T) {
|
||||||
|
for i, test := range []struct {
|
||||||
|
vector *Vector
|
||||||
|
want int
|
||||||
|
}{
|
||||||
|
{vector: NewVector(3, nil), want: 3},
|
||||||
|
{
|
||||||
|
vector: &Vector{
|
||||||
|
mat: blas64.Vector{
|
||||||
|
Data: make([]float64, 7, 10),
|
||||||
|
Inc: 3,
|
||||||
|
},
|
||||||
|
n: 3,
|
||||||
|
},
|
||||||
|
want: 4,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
vector: &Vector{
|
||||||
|
mat: blas64.Vector{
|
||||||
|
Data: make([]float64, 10),
|
||||||
|
Inc: 3,
|
||||||
|
},
|
||||||
|
n: 4,
|
||||||
|
},
|
||||||
|
want: 4,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
vector: &Vector{
|
||||||
|
mat: blas64.Vector{
|
||||||
|
Data: make([]float64, 11),
|
||||||
|
Inc: 3,
|
||||||
|
},
|
||||||
|
n: 4,
|
||||||
|
},
|
||||||
|
want: 4,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
vector: &Vector{
|
||||||
|
mat: blas64.Vector{
|
||||||
|
Data: make([]float64, 12),
|
||||||
|
Inc: 3,
|
||||||
|
},
|
||||||
|
n: 4,
|
||||||
|
},
|
||||||
|
want: 4,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
vector: &Vector{
|
||||||
|
mat: blas64.Vector{
|
||||||
|
Data: make([]float64, 13),
|
||||||
|
Inc: 3,
|
||||||
|
},
|
||||||
|
n: 4,
|
||||||
|
},
|
||||||
|
want: 5,
|
||||||
|
},
|
||||||
|
} {
|
||||||
|
got := test.vector.Cap()
|
||||||
|
if got != test.want {
|
||||||
|
t.Errorf("unexpected capacty for test %d: got: %d want: %d", i, got, test.want)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestVectorAtSet(t *testing.T) {
|
func TestVectorAtSet(t *testing.T) {
|
||||||
for i, test := range []struct {
|
for i, test := range []struct {
|
||||||
vector *Vector
|
vector *Vector
|
||||||
|
Reference in New Issue
Block a user