2016-04-28 11 views
0

Ein Neuling hier.Scala: Iteration 2d Array zu tun

val arr_one = Array(Array(1, 2), Array(3, 4), Array(5, 6),Array(x, y)..and so on) 
val arr_two = Array(Array(2,3), Array(4, 5), Array(6, 7)) 
var tempArr = ArrayBuffer[Double]() 

Ich möchte arr_one und arr_two multiplizieren. zum Beispiel

Iteration1: Array(3*2+4*3, 3*4 +4*5, 3*6+4*7) assign

Iteration3 tempArr: Array(1*2+2*3, 1*4 +2*5, 1*6+2*7) assign

Iteration2 tempArr Array(5*2+6*3, 5*4 +6*5, 5*6+6*7) assign

ich, dass

val x = Array(1, 2) ; val y = Array(Array(2,3), Array(4, 5), Array(6, 7)) 

Ich kann, wenn

wusste tempArr verwenden y map {x zip _ map{case(a, b) => a * b} sum}

Aber wenn x wie arr_one Form, ich weiß nicht, wie man for loop or something else verwendet, um das zu tun.

Ich habe wirklich auf Idee.

Wie kann ich das in scala tun?

Wirklich danke.

+0

Was zwischen Iterationen zu Ihrem tempArr passiert? Benutzt du es innerhalb der Iteration oder kombinierst du es irgendwie mit dem vorherigen Wert von tempArr? – Mifeet

Antwort

0

Kann sein, das ist, was Sie brauchen:

val tmp = arr_one map ((arr1) => {arr_two map (arr2 => (arr1 zip arr2) map {case(a, b) => a * b} reduce (_ + _))}) 

Und ArrayBuffer einfach zu bekommen verwenden:

tmpArr = tmp.toBuffer 
1

Ich glaube, das tut, was Sie brauchen, ohne wandelbaren Zustand und „Wiederholungen“ - es verwendet die „for-comprehension“ Syntax, die Art eines nicht zwingend notwendig, for-Schleife ist - mit anderen Worten, statt Zustand ändern in jeder Iteration es gibt einen Wert, die die Sequenz der Ergebnisse pro "Iteration" ist:

val result: Array[Array[Int]] = for (arr1 <- arr_one) yield { 
    for (arr2 <- arr_two) yield multArrays(arr1, arr2) 
} 

Unter der Annahme, dass multArrays folgende Signatur hat:

def multArrays(arr1: Array[Int], arr2: Array[Int]): Int 

Das berechnet den Wert für jede Zelle. Eine naive Implementierung (vorausgesetzt Arrays der Größe 2) wäre:

def multArrays(arr1: Array[Int], arr2: Array[Int]): Int = { 
    arr1(0) * arr2(0) + arr1(1) * arr2(1) 
} 

Aber natürlich können diese auf jede beliebige Größe Arrays verallgemeinert werden.

+0

oh, gerade festgestellt, dass Sie an einem Ergebnis der Form 'Array [Double]' interessiert sind - aber nicht klar, welche Logik angewendet werden sollte, um es zu erhalten. Hoffe, die Antwort hilft trotzdem, vielleicht können Sie den Rest herausfinden ... Wenn Sie Standardmatrixmultiplikation brauchen, gibt es eine nette (wenn auch nicht triviale) Implementierung hier: https://rosettacode.org/wiki/Matrix_multiplication#Scala –

+0

Ich hab es geschafft. Danke, dass du mir geholfen hast. –