1

下面是一个将生成相关矩阵的代码示例,但我需要在矩阵的前面和顶部添加列标题和行标题。 矩阵

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

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

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
4

1 回答 1

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) 
}

当然,这样你会丢失所有的输入信息,但如果你只需要 toString 一些东西,这可能是当前 Breeze 中最快的方法。

于 2015-09-08T01:47:10.600 回答