用Scala库微风填充矩阵

时间:2017-01-09 23:11:15

标签: scala matrix scala-breeze scala-nlp

我是Scala的新手,而且我对一个看似简单的问题有心理障碍。我正在使用Scala库breeze,需要使用array buffer(可变)并将结果放入矩阵中。这......应该很简单但是? Scala是如此疯狂地输入类型breeze似乎对制作DenseVector时将采取的数据类型非常挑剔。这只是一些原型代码,但任何人都可以帮我提出解决方案吗? 现在我有类似......

//9 elements that need to go into a 3x3 matrix, 1-3 as top row, 4-6 as middle row, etc)
val numbersForMatrix: ArrayBuffer[Double] = (1, 2, 3, 4, 5, 6, 7, 8, 9) 
//the empty 3x3 matrix
var M: breeze.linalg.DenseMatrix[Double] = DenseMatrix.zeros(3,3)

在微风中,你可以做类似的事情     M(0,0) = 100并以这种方式将第一个值设置为100, 你也可以这样做:     M(0, 0 to 2) := DenseVector(1, 2, 3) 它将第一行设置为1,2,3 但我无法做到像...这样的事情。

var dummyList: List[Double] = List(1, 2, 3) //this works
var dummyVec = DenseVector[Double](dummyList) //this works
M(0, 0 to 2) := dummyVec //this does not work

并成功将第一行更改为1,2,3。 这就是List,甚至不是ArrayBuffer。

我愿意从ArrayBuffer改变数据类型,但根本不确定如何处理这个...可以尝试逐个更新矩阵值,但这似乎是非常hacky编码(?)。

注意:我是一名Python程序员,他习惯使用numpy并只给它数组。 breeze文档没有提供足够的其他数据类型示例,以便我能够解决这个问题。 谢谢!

1 个答案:

答案 0 :(得分:2)

Breeze除了对类型的挑剔之外,对于矢量形状非常挑剔:DenseVectors是列向量,但是你试图分配给一个行的子集,它需要一个转置的DenseVector:

M(0, 0 to 2) := dummyVec.t