为了账号安全,请及时绑定邮箱和手机立即绑定

Gonum 在使用嵌入式结构时抛出坏区恐慌

Gonum 在使用嵌入式结构时抛出坏区恐慌

Go
跃然一笑 2023-03-21 16:59:00
我正在使用 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)


查看完整回答
反对 回复 2023-03-21
?
千万里不及你

TA贡献1784条经验 获得超9个赞

问题是在进行阴影检测时比较指针。这是海事组织的一个错误。我刚刚提交了https://github.com/gonum/gonum/issues/945


查看完整回答
反对 回复 2023-03-21
  • 2 回答
  • 0 关注
  • 74 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信