2011-04-21 1 views
1

Если у меня есть следующий код:Как добавить одну матрицу в другую в Scala?

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) поддерживается постоянным.

EDIT: Пока что оба предоставленных решения растут во втором измерении. Я пытаюсь зафиксировать второе измерение.

ответ

5

Функциональные, но не как производительные, как императив альтернатива будет:

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)) 
+0

Производительность не вызывает особой озабоченности эту часть кода. Можно ли выращивать его в другом направлении? То есть, в моем сообщении, я имел постоянный P (второе измерение) –

+0

Спасибо, что сделал трюк. –

+1

Самый простой (хотя и не обязательно быстрый) способ расти в другом измерении - сначала «транспонировать» два входных массива, а затем транспонировать выходные данные после конкатенации. –

1
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)) 
+0

Можно ли выращивать его в другом направлении? То есть, в моем сообщении, я имел постоянную P (второе измерение) –

 Смежные вопросы

  • Нет связанных вопросов^_^