- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在使用 gonum 执行一些线性代数计算。扩展原始 mat.VecDense
结构后,在对自身应用方法时出现“坏区域:相同” panic 。当我使用 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: identical
AddVec
是一种方法 implemented by gonum :
func (v *VecDense) AddVec(a, b Vector)
为什么会这样,请问正确的实现方式是什么?
编辑:
感谢@Himanshu 我设法解决了这个问题。
我为我正在使用的每个方法创建了传递方法,传递结构的正确级别:
type Vector struct {
*mat.VecDense
}
func NewVector(n int, data []float64) Vector {
return Vector{mat.NewVecDense(n, data)}
}
func (v *Vector) AddVec(a, b Vector) {
v.VecDense.AddVec(a.VecDense, b.VecDense)
}
func (v *Vector) SubVec(a, b Vector) {
v.VecDense.SubVec(a.VecDense, b.VecDense)
}
func (v *Vector) ScaleVec(alpha float64, a Vector) {
v.VecDense.ScaleVec(alpha, a.VecDense)
}
func (v *Vector) AddScaledVec(a Vector, alpha float64, b Vector) {
v.VecDense.AddScaledVec(a.VecDense, alpha, b.VecDense)
}
此外 - 我不确定这是否是正确的方法 - 我还将 NewVector
的返回类型从指针更改为值,因为它包含指向 的指针mat.VecDense
无论如何。请注意,*mat.VecDense
满足来自 gonum 的 Vector
接口(interface),因此将此内部字段传递给方法可以正常工作,如上例所示。
最佳答案
在 Golang 中,它被描述为提升的方法
Promoted fields act like ordinary fields of a struct except that they cannot be used as field names in composite literals of the struct.
给定结构类型 S 和定义类型 T,提升的方法包含在结构的方法集中,如下所示:
问题是您将指针类型参数传递给 AddVec
函数。但是在第二种情况下您使用的是指针类型字段。
func (v *VecDense) AddVec(a, b Vector)
还有一件事要注意,AddVec
具有 Vector
结构的值类型参数,但您将指针传递给 Vector
字段作为
x, y := NewVector(3, []float64{1, 2, 3}), NewVector(3, []float64{4, 5, 6})
上面代码中的x,y
是NewVector
返回的指针类型
x.AddVec(x, y)
关于Gonum 在使用嵌入式结构时抛出坏区 panic ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51950841/
gonum.org/v1/gonum无法识别为go软件包。 glide get gonum.org/v1/gonum出错了 $> go get gonum.org/v1/gonum 无法加载软件包:软
我正在使用 gonum 执行一些线性代数计算。扩展原始 mat.VecDense 结构后,在对自身应用方法时出现“坏区域:相同” panic 。当我使用 gonum 提供的原始设置时,不会出现此错误。
是否可以在 gonum/plot 中将多个绘图合并到一个图像中?他们应该有自己的轴。是否可以将它们垂直、水平或可能在网格中堆叠? 在 matplotlib 中它看起来像这样。 最佳答案 您可以使用 p
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 4 年前。 Improve t
我正在尝试使用循环添加多个图,但我似乎无法弄清楚如何放入线条。这是我正在处理的代码: func plot_stochastic_processes(processes [][]float64, tit
我想将 mat.Dense 矩阵与 mat.VecDense 向量相乘,但显然 mat.Dense 和 mat .VecDens 不实现 Matrix 接口(interface)或定义将矩阵与向量相乘
我有一大堆元素和另一个大小相同的权重数组。我想根据第二个数组的权重从第一个数组中进行不替换的采样。有没有办法使用 gonum 来做到这一点? ? 最佳答案 Weighted及其相关方法.Take()看
是否可以在 gonum/plot 中制作具有公共(public)横坐标轴的多线图? 在 matplotlib 中它看起来像这样。 最佳答案 是的,这是可能的。您可以使用 plot.Align: pac
正如标题中所写,如何创建具有 complex128 的矩阵实例?下面的复数等价物是什么? matrix := mat.NewDense(2, 2, []float64{0, 0, 0, 3}) 我怎么
作为 numpy 的忠实粉丝,我很高兴地发现 golang 库正在开发中。我主要根据文档编写了一个小型测试程序,如下所示: package main import ( "fmt" "m
我是一名新的 Go 程序员,几天前刚刚完成了“Go 之旅”教程。我想创建一个 150 x 120 大小的图,然后获取每个节点的所有边缘节点并实现一些图搜索算法,例如 BFS 和 Dijkstra。我找
我想使用 gonum 库来试验一些神经网络的东西,但我无法通过安装过程... 我正在运行官方 gonum 网站上的命令: go get -u -t gonum.org/v1/gonum/... 但它给
我是一名优秀的程序员,十分优秀!