user3341078
user3341078

Reputation: 459

Scala Breeze adding row and column header to DenseMatrix

Below is an example of code which will generate Correlation Matrix but I need to add column header and row header in front and top of matrix. Matrix

For example in the above matrix amber coloured objects are the labels which i need to add to the blue coloured data generated by Correlation matrix whose code i have attached below.

In Scala breeze is there a way to add labels to matrix ? The problem is DenseMatrix is Double and labels are character so i am not able to add any char label to matrix object.

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

Edit

Thanks David. Your solution really worked well for me.

  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

Upvotes: 1

Views: 505

Answers (1)

dlwh
dlwh

Reputation: 2293

There's nothing built in, sadly. You could do something like

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

You lose all typing information that way, of course, but if you just need to toString something, it's probably the quickest way in current Breeze.

Upvotes: 1

Related Questions