我正在使用 gonum 執行一些線性代數計算。擴展原始mat.VecDense結構后,在對自身應用方法時出現“壞區域:相同”恐慌。當我使用 gonum 提供的原始設置時,不會出現此錯誤。這是我的實現:type Vector struct { mat.VecDense}func NewVector(n int, data []float64) *Vector { return &Vector{*mat.NewVecDense(n, data)}}我正在使用以下代碼片段對其進行測試:func main() { u, v := mat.NewVecDense(3, []float64{1, 2, 3}), mat.NewVecDense(3, []float64{4, 5, 6}) fmt.Printf("[U - NewVecDense]\tADDRESS: %v, VALUE: %v\n", &u, u) fmt.Printf("[V - NewVecDense]\tADDRESS: %v, VALUE: %v\n", &v, v) u.AddVec(u, v) fmt.Println("-------------------------") x, y := NewVector(3, []float64{1, 2, 3}), NewVector(3, []float64{4, 5, 6}) fmt.Printf("[X - NewVector]\tADDRESS: %v, VALUE: %v\n", &x, x) fmt.Printf("[Y - NewVector]\tADDRESS: %v, VALUE: %v\n", &y, y) x.AddVec(x, y) fmt.Println(x)}雖然第一次添加執行正常,但第二次失?。篬U - NewVecDense] ADDRESS: 0xc42000c028, VALUE: &{{[1 2 3] 1} 3}[V - NewVecDense] ADDRESS: 0xc42000c030, VALUE: &{{[4 5 6] 1} 3}-------------------------[X - NewVector] ADDRESS: 0xc42000c040, VALUE: &{{{[1 2 3] 1} 3}}[Y - NewVector] ADDRESS: 0xc42000c048, VALUE: &{{{[4 5 6] 1} 3}}panic: mat: bad region: identicalAddVec是gonum 實現的方法:func (v *VecDense) AddVec(a, b Vector)為什么會發生這種情況,手實施這個的正確方法是什么?
2 回答

茅侃侃
TA貢獻1842條經驗 獲得超21個贊
在 Golang 中,將提升的方法描述為
提升字段的作用類似于結構的普通字段,只是它們不能用作結構的復合文字中的字段名稱。
給定結構類型 S 和定義類型 T,提升的方法包含在結構的方法集中,如下所示:
如果 S 包含一個嵌入字段 T,則 S 和 *S 的方法集都包括接收者為 T 的提升方法。*S 的方法集還包括接收者為 *T 的提升方法。
如果 S 包含嵌入字段 *T,則 S 和 *S 的方法集都包含接收者為 T 或 *T 的提升方法。
問題是您將指針類型參數傳遞給AddVec
函數。但是在第二種情況下您使用的是指針類型字段。
func (v *VecDense) AddVec(a, b Vector)
需要注意的另一件事是它AddVec
具有 struct 的值類型參數Vector
,但您將指針傳遞給Vector
字段
x, y := NewVector(3, []float64{1, 2, 3}), NewVector(3, []float64{4, 5, 6})
在上面的代碼中x,y
是從返回的指針類型NewVector
x.AddVec(x, y)

千萬里不及你
TA貢獻1784條經驗 獲得超9個贊
問題是在進行陰影檢測時比較指針。這是海事組織的一個錯誤。我剛剛提交了https://github.com/gonum/gonum/issues/945
- 2 回答
- 0 關注
- 126 瀏覽
添加回答
舉報
0/150
提交
取消