Scala Breeze向DenseMatrix添加行和列标题

时间:2015-09-05 22:40:07

标签: scala scala-breeze

以下是生成Correlation Matrix的代码示例,但我需要在矩阵的前面和顶部添加列标题和行标题。 Matrix

例如,在上面的矩阵中,琥珀色的对象是我需要添加到由相关矩阵生成的蓝色数据的标签,其代码我已在下面附加。

在Scala微风中有没有办法为矩阵添加标签?问题是DenseMatrix是Double,标签是字符,所以我无法向矩阵对象添加任何char标签。

def getCorMatrix(c :String,d :String,n :Int) :breeze.linalg.DenseMatrix[Double] = {

CorMatrixlogger.info("Inside generating Correlation Matrix")  

val query = MongoDBObject("RunDate" -> d) ++ ("Country" -> c)
CorMatrixlogger.info("Query Object created for {}", c)  

val dbObject = for (d <- price.find(query)) yield(d)
val objectReader = (dbObject map {x => objectRead(x)}).toList
val fetchAssetData = objectReader map {x => x.Symbol} map { x=> assetStats(x,n) } filterNot {x => x.length < n-1}
CorMatrixlogger.info("Asset Data fetched")

val excessReturnMatrix = DenseMatrix((for(i <- fetchAssetData) yield i.excessReturn).map(_.toArray):_*)
CorMatrixlogger.info("Excess Return matrix generated")  

val transposeExcessreturnMatrix = excessReturnMatrix.t
val vcvMatrix = breeze.numerics.rint(((excessReturnMatrix * transposeExcessreturnMatrix):/ (n-1).toDouble ) :* 1000000.0) :/ 1000000.0
CorMatrixlogger.info("VcV Matrix Generated")  

val transposeStDevVector = DenseMatrix(for (i <- fetchAssetData ) yield i.sigma)
val stDevVector = transposeStDevVector.t
val stDevMatrix = breeze.numerics.rint(( stDevVector * transposeStDevVector) :* 1000000.0) :/ 1000000.0
CorMatrixlogger.info("Correlation Matrix Generated")  

lowerTriangular(breeze.numerics.rint((vcvMatrix :/ stDevMatrix) :* 10000.0) :/ 10000.0)
  }

修改

谢谢大卫。你的解决方案对我来说真的很好。

  val ma = DenseMatrix((1.0,2.0,3.0), (3.0,4.0,5.0),(6.0,7.0,8.0))

  val im = DenseMatrix.tabulate(ma.rows,ma.cols)(ma(_,_).toString)

  val head = DenseVector("a","b","c")         
  val thead = head.t                            
  val withHeader:DenseMatrix[String] = DenseMatrix.tabulate(im.rows+1, im.cols+1) { (i, j) =>
        if (i == 0 && j == 0) " "
        else if (i == 0) head(j -1)
        else if (j == 0 ) thead (i -1)
        else im(i-1,j-1)

  }                                           //> withHeader  : breeze.linalg.DenseMatrix[String] =    a    b    c    
                                              //| a  1.0  2.0  3.0  
                                              //| b  3.0  4.0  5.0  
                                              //| c  6.0  7.0  8.0

1 个答案:

答案 0 :(得分:1)

遗憾的是,没有内置任何东西。你可以做点什么

val withHeader:DenseMatrix[Any] = DenseMatrix.tabulate(n+1, m+1){ (i, j) => 
  if (i == 0 && j == 0) ""
  else if (i == 0) colHeaders(j - 1)
  else if (j == 0) rowHeaders(i - 1)
  else orig(i - 1, j - 1) 
}

当然,你会失去所有打字信息,但如果你只是需要一些东西,它可能是目前Breeze中最快捷的方式。