Я думаю, что вы можете использовать немного функционального программирования, которое Scala может предложить вам, Breeze очень полезен для работы, как в matlab, но argmax() дает только индекс, который имеет большее число в векторе , Конечно, вы можете так работать, а затем получить второй больше, а затем третий ..., но здесь у вас есть предложение, я думаю, что это также поможет вашему Spark-коду, чтобы распараллелить и работать с более крупной матрицей, пожалуйста читать комментарии для объяснения, а также не стесняйтесь вносить изменения для того, чтобы получить максимальные возможности использования Spark:
package breeze
import breeze.linalg.{DenseMatrix }
/**
* Created by anquegi on 24/05/15.
*/
object TestMatrix extends App {
//This is a DenseMatrix from Breeze,
// I suppose that you have something like this
val m = DenseMatrix(
(0.23, 0.20, 0.10, 0.92, 0.33, 0.42),
(0.10, 0.43, 0.23, 0.15, 0.22, 0.12),
(0.20, 0.13, 0.25, 0.85, 0.02, 0.32),
(0.43, 0.65, 0.23, 0.45, 0.10, 0.33),
(0.31, 0.87, 0.45, 0.63, 0.28, 0.16),
(0.12, 0.84, 0.33, 0.45, 0.56, 0.83),
(0.40, 0.22, 0.12, 0.87, 0.35, 0.78))
// Let's work in a mix functional style and iterator working with columns
// look at this example
val a = m(::, 0) // get the firts column
.toArray // pass to scala array for functional usage, you can use then to List
.zipWithIndex // now you have and array like [(value0,0),(value1,1) ... (valuen,n)]
.sortWith((x, y) => x._1 > y._1) // sort by bigger number
.take(5) // get only 5 first numbers
.map(x => x._2) // finally get the indexes
//now we have to loop for each colum
// prepare the matrix and get the Vector(indexes,Array[Int],Array[Int])
val listsOfIndexes = for (i <- Range(0, m.cols))
yield m(::, i).toArray
.zipWithIndex
.sortWith((x, y) => x._1 > y._1)
.take(5)
.map(x => x._2)
//finally conver to a DenseMatrix
val mIndex = DenseMatrix(listsOfIndexes.map(_.toArray): _*).t
println(mIndex)
}
и результат:
[info] Running breeze.TestMatrix
3 4 4 0 5 5
6 5 5 6 6 6
4 3 2 2 0 0
0 1 1 4 4 3
2 6 3 3 1 2
[success] Total time: 5 s, completed 24/05/2015 16:59:43
PLE ase supply exact scala type вашей коллекции – Odomontois
Я не вижу, как связаны ваши выходные и входные данные. Пожалуйста, объясните более подробно –
argmax() возвращает максимальный индекс не максимальное значение, я хочу что-то вроде этого, но он может вернуть пять первых максимальных индексов. – Rozita