我首先需要说的是,我对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中矩阵的最佳实践(假设不应该应用线性代数,而是计算和读取)?
谢谢。
编辑: 通过行解决了,但如果需要对列进行相同的操作呢?我想如果矩阵非常大,应该避免转置。
答案 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})}}