Scala:计算矩阵中

时间:2016-09-06 10:31:36

标签: arrays scala matrix count

我首先需要说的是,我对Scala的集合“map”还是一个新功能。

我要做的是计算矩阵的每一行,列表的元素(在这种情况下从0到n的数字)出现多少次(全部)。理想输出是一个矩阵,其输入矩阵的行数相同,列数与列表长度相同。 例如:

val list = List(0,1,2)

val matrix = Array(
     Array(0,1,2,2),
     Array(0,0,1,0),
     Array(2,0,2,0))

在这种情况下我想获得这样一个矩阵

1 1 2
3 1 0
2 0 2

到目前为止我想出的是:

val counts = matrix.map(r => r.map(x => (x,r.count(_ == x))).groupBy(_._1))

其中第一部分(直到groupBy)为每一行提供了种类(元素,计数)的对。然后我尝试对此进行分组,但它并没有像我预期的那样完成。

这当然离我想要达到的目标很远,因为它只计算矩阵中的元素(因此永远不会给出0)。

另外,在主题中,Array [Array [Type]]是处理Scala中矩阵的最佳实践(假设不应该应用线性代数,而是计算和读取)?

谢谢。

编辑: 通过行解决了,但如果需要对列进行相同的操作呢?我想如果矩阵非常大,应该避免转置。

3 个答案:

答案 0 :(得分:1)

对于r中的每一行matrix,将i中的每个项list映射到r中出现的次数:

matrix.map(r => list.map(i => r.count(_ == i)))

答案 1 :(得分:0)

与此同时,我提出了这样的解决方案,但我非常确定有更紧凑和惯用的方法。

def count_list_row(row: Array[Int], tot_elements: Int): Array[Int] ={
      val counts = new Array[Int](tot_elements)
      for(element <- 0 until tot_elements){
        counts(element) = row.count(_ == element)
      }
      return counts
    }

val counts = matrix.map(r => count_list_row(r,2))

答案 2 :(得分:0)

使用foldLeft:

matrix.map { row => {row.foldLeft(Array(0,0,0))((r,e)=> {if(list.contains(e)) {r(e) += 1}; r})}}