2015-09-05 1 views
1

Ci-dessous un exemple de code qui va générer une matrice de corrélation mais j'ai besoin d'ajouter un en-tête de colonne et un en-tête. Par exemple, dans la matrice ci-dessus, les objets de couleur ambre sont les étiquettes que j'ai besoin d'ajouter aux données de couleur bleue générées par la matrice de corrélation dont le code a été joint ci-dessous.Scala Breeze ajoute une ligne et un en-tête de colonne à DenseMatrix

Dans Scala brise est-il un moyen d'ajouter des étiquettes à la matrice? Le problème est que DenseMatrix est Double et que les étiquettes sont des caractères, donc je ne peux pas ajouter d'étiquette char à l'objet matrix.

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

Modifier

Merci David. Votre solution a vraiment bien fonctionné pour moi.

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

Je ne sais vraiment pas ce que vous voulez dire. Voulez-vous dire les étiquettes de colonne et de ligne? Ou juste une autre colonne et une autre rangée? Pouvez-vous reformuler votre question et peut-être découper tout ce qui n'est pas réellement lié à la question? – dlwh

+0

Merci David d'être revenu. J'ai essayé d'élaborer ma question. – user3341078

Répondre

1

Rien n'est construit, malheureusement. Vous pouvez faire quelque chose comme

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

Vous perdez toutes les informations en tapant cette façon, bien sûr, mais si vous avez juste besoin de toString quelque chose, il est probablement le moyen le plus rapide dans Breeze actuelle.