2015-03-03 2 views
2

Следующий код усредняет значения в той же позиции в массиве:значения усреднением на той же позиции в списке

val toadd = List(Array(8.0, 4.0), Array(5.0, 8.0), Array(7.0, 5.0)) 
    val a1 = toadd.map(m => m(0)).sum 
    val a2 = toadd.map(m => m(1)).sum  
    (a1/toadd.size , a2/toadd.size) 

В настоящее время это только работает для массивов длины 2.

Как это может быть модифицирован так что он работает для массивов произвольной длины?

ответ

3

Как об использовании transpose:

toadd.transpose.map(xs => xs.sum/xs.size) 
// List(6.666666666666667, 5.666666666666667) 
0

Вы хотите что-то вроде

val innerSize = toadd.map(_.length).min 

, а затем карту от 0 until innerSize а не делать это вручную с a1, a2 и т.д ..

2

I как идея использования transpose, как было предложено дхг. Если вы хотите использовать более примитивные функции, вы можете сделать:

toadd reduce { 
    (x, y) => (x zip y) map { 
     case (a, b) => a + b 
    } 
} map { a => a/toadd.length } 

Или более кратко:

toadd.reduce(_.zip(_).map(a=>a._1+a._2)).map(_/toadd.length) 
Смежные вопросы