2016-12-18 3 views
0

I zwei Matrizen initialisiert (X und Y) in Scala wie folgtWie eine Matrix mit einer anderen Matrix in Scala aufzuteilen

var x = ofDim[Int](a1,b1) 
var y = ofDim[Int](a2,b2) 

x, y, a1, a2, b1 und b2 sind Variablen. und jetzt muss ich X durch Y (X/Y) entscheiden. Wie kann das erreicht werden?

+0

Sie meinen Elmentwise Division oder 'XY^(- 1)' Matrix Multiplikation? – Psidom

+0

@Psidom, ich meine, wenn A, X, Y sind Matrizen, und wenn AX = Y und A und Y sind bekannte Matrizen, so muss ich X Matrix bekommen. Ich denke, es sollte XY^(- 1) sein. –

+0

Vielleicht möchten Sie die Brise-Bibliothek überprüfen, es implementiert einige lineare Algebra mit Vektor und Matrizen. Aber wenn du mit rdds umgehen willst, ist das ein anderes Problem. – Psidom

Antwort

2

Dort ist ein anderer Ansatz, der Apache Commons verwendet. Es ist jedoch wichtig zu beobachten, dass die Teilungsoperation gilt Operationen Multiplikation und Inversion und einige Matrix sind inversable und andere nicht: https://en.wikipedia.org/wiki/Invertible_matrix

Das folgende Beispiel gilt die Bibliothek Apache Commons (Study.scala):

import org.apache.commons.math3.linear._ 

object Study { 

    def main(args: Array[String]): Unit = { 

    val xArray = Array(Array(1.0, 2.0), Array(3.0, 4.0)) 
    val yArray = Array(Array(1.0, 2.0), Array(3.0, 4.0)) 

    val x = new Array2DRowRealMatrix(xArray) 
    val y = new Array2DRowRealMatrix(yArray) 

    val yInverse = new LUDecomposition(y).getSolver().getInverse(); 
    val w = x.multiply(yInverse) 

    for(i <- 0 until w.getRowDimension()) 
     for(j <- 0 until w.getColumnDimension()) 
      println(w.getEntry(i, j)) 

    } 
} 

Tipp: Wenn Sie beabsichtigen, die scala Konsole zu verwenden, müssen Sie den classpath angeben ...

scala -classpath .../commons-math3/3.2/commons-math3-3.2.jar 

... in der scala Session Sie den Algorithmus geladen ...

:load .../Study.scala 

... und die Ergebnisse kommen die Hauptfunktion der Studie Aufruf (Näherung angewendet werden kann) ...

scala> Study.main(null)             

0,99/1.11E-16/0,0/1,02

1

Versuchen:

import breeze.linalg.{DenseMatrix, inv} 

val mx = new DenseMatrix(a1, b1, x.transpose.flatten) 
val my = new DenseMatrix(a2, b2, y.transpose.flatten) 

mx * inv(my) 
1

Die Bibliothek Beeze, wie in anderen Antworten mecioned, notwendig. Sie können es SBT oder Maven installieren

The Breeze Projekt heruntergeladen werden kann von GitHub

Dies ist der Maven-Ansatz:

<dependency> 
    <groupId>org.scalanlp</groupId> 
    <artifactId>breeze_2.10</artifactId> <!-- or 2.11 --> 
    <version>0.12</version> 
</dependency> 

Der Code ...

import breeze.linalg.DenseMatrix 

object Division { 

    def main(args: Array[String]): Unit = { 

     var a1 = 10 
     var a2 = 11 
     var b1 = 12 
     var b2 = 13 

     //var x = Array.ofDim[Int](a1,b1) 
     //var y = Array.ofDim[Int](a2,b2) 

     var x = DenseMatrix(a1,b1) 
     var y = DenseMatrix(a2,b2) 

     var result = x/y 
     print(result) 
    } 
} 
Verwandte Themen