/ / Scala Breeze ajout d’en-têtes de lignes et de colonnes dans DenseMatrix - scala, scala-breeze

Scala Breeze ajoutant un en-tête de lignes et de colonnes à DenseMatrix - scala, scala-breeze

Vous trouverez ci-dessous un exemple de code qui générera une matrice de corrélation, mais je dois ajouter un en-tête de colonne et un en-tête de ligne au début et à la fin de la matrice. Matrice

Par exemple, dans la matrice ci-dessus, les objets de couleur orange sont les étiquettes que je dois ajouter aux données de couleur bleue générées par la matrice de corrélation dont le code est joint ci-dessous.

Dans Scala Breeze, existe-t-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, je ne peux donc pas ajouter de caractère à 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

Réponses:

1 pour la réponse № 1

Malheureusement, rien n’est intégré. Vous pourriez 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 de frappe de cette façon, bien sûr, mais si vous avez juste besoin de renvoyer quelque chose à la chaîne, c’est probablement le moyen le plus rapide dans Breeze actuel.