1

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
user3341078
  • 449
  • 1
  • 5
  • 16
  • i really don't know what you mean. Do you mean column and row labels? Or just another column and another row? can you rephrase your question and maybe trim everything that's not actually related to the question? – dlwh Sep 07 '15 at 16:41
  • Thanks David for coming back. I have tried to elaborate my question. – user3341078 Sep 07 '15 at 22:31

1 Answers1

1

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.

dlwh
  • 2,257
  • 11
  • 23