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
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
Merci David d'être revenu. J'ai essayé d'élaborer ma question. – user3341078