Как добавить одну матрицу в другую в Scala? - PullRequest
1 голос
/ 21 апреля 2011

Если у меня есть следующий код:

var A = Array[Array[Double]]()    // where A becomes an MxP matrix
var B = Array[Array[Double]]()    // where B becomes an NxP matrix

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

val C = A append B    // where C is a (M+N)xP matrix

Очевидно, что одно из измерений (в данном случае P) поддерживается постоянным.

РЕДАКТИРОВАТЬ: до сих пор оба из предоставляемых решений растут во втором измерении. Я пытаюсь удержать второе измерение фиксированным.

Ответы [ 2 ]

5 голосов
/ 21 апреля 2011

Функционально, но не так эффективно, как императивная альтернатива:

scala> val a = Array.tabulate(2, 3)((_, _) => (math.random * 100).toInt)
a: Array[Array[Int]] = Array(Array(52, 61, 58), Array(35, 69, 39))

scala> val b = Array.tabulate(2, 4)((_, _) => (math.random * 100).toInt)
b: Array[Array[Int]] = Array(Array(51, 54, 87, 10), Array(52, 76, 18, 85))

scala> (a, b).zipped.map(_ ++ _)
res0: Array[Array[Int]] = Array(Array(52, 61, 58, 51, 54, 87, 10), Array(35, 69, 39, 52, 76, 18, 85))

(В ответ на комментарий ...)

Удержание второго измерения фиксированным:

scala> val x = Array.tabulate(3, 2)((_, _) => (math.random * 100).toInt)
x: Array[Array[Int]] = Array(Array(13, 26), Array(96, 6), Array(68, 58))

scala> val y = Array.tabulate(2, 2)((_, _) => (math.random * 100).toInt)
y: Array[Array[Int]] = Array(Array(82, 5), Array(0, 76))

scala> x ++ y
res1: Array[Array[Int]] = Array(Array(13, 26), Array(96, 6), Array(68, 58), Array(82, 5), Array(0, 76))
1 голос
/ 21 апреля 2011
scala> val a = Array.fill(4,3) { 1. };
a: Array[Array[Double]] = Array(Array(1.0, 1.0, 1.0), Array(1.0, 1.0, 1.0), Array(1.0, 1.0, 1.0), Array(1.0, 1.0, 1.0))

scala> val b = Array.fill(4,6) { 2. };         
b: Array[Array[Double]] = Array(Array(2.0, 2.0, 2.0, 2.0, 2.0, 2.0), Array(2.0, 2.0, 2.0, 2.0, 2.0, 2.0), Array(2.0, 2.0, 2.0, 2.0, 2.0, 2.0), Array(2.0, 2.0, 2.0, 2.0, 2.0, 2.0))

scala> for((aa,bb) <- a zip b) yield (aa ++ bb)
res0: Array[Array[Double]] = Array(Array(1.0, 1.0, 1.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0), Array(1.0, 1.0, 1.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0), Array(1.0, 1.0, 1.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0), Array(1.0, 1.0, 1.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0))
...