/ / Scala Breeze добавя заглавие на ред и колона към DenseMatrix - scala, scala-breeze

Scala Breeze добавя заглавието на ред и колона към DenseMatrix - скала, скала-бриз

По-долу е даден пример за код, който ще генерира корелационна матрица, но аз трябва да добавя заглавието на колоната и заглавието на ред пред и отгоре на матрицата. матрица

Например в горната матрица кехлибарени цветни обекти са етикетите, които трябва да добавя към синьо оцветените данни, генерирани от корелационната матрица, чийто код имам долу.

В Scala breeze има ли начин да добавите етикети към матрицата? Проблемът е DenseMatrix е двойно и етикетите са характер, така че аз не съм в състояние да добавите някакъв char знак за обект матрица.

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

Отговори:

1 за отговор № 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)
}

По този начин, разбира се, губите цялата информация за писане, но ако просто трябва да изпишете нещо, това е може би най-бързият начин в текущия Breeze.