2015-09-05 28 views
1

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

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

在斯卡拉微风有一种方法可以添加标签矩阵?问题是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 
+0

我真的不知道你的意思。你是指列和行标签?或者只是另一列和另一行?你可以重新提出你的问题,也许修改一切与问题无关的事情吗? – dlwh

+0

感谢大卫回来。我试图阐述我的问题。 – user3341078

回答

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东西,它可能是在当前微风的最快方式。