2016-12-18 4 views
0

Я инициализируются две матрицы (X и Y) в Scala следующим образом,Как разделить матрицы на другую матрицу в Scala

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

х, у, a1, a2, b1 и b2 являются переменными. , и теперь мне нужно решить X по Y (X/Y). Как это можно достичь?

+0

Вы имеете в виду elmentwise division или 'XY^(- 1)' matrix multipication? – Psidom

+0

@ Psidom, я имею в виду, если A, X, Y являются матрицами, а если AX = Y и A и Y являются известными матрицами, поэтому мне нужно получить матрицу X. Я думаю, что это должно быть XY^(- 1). –

+0

Возможно, вы захотите проверить библиотеку бриза, она реализует довольно много линейной алгебры с Vector и Matrices. Но если вы хотите иметь дело с rdds, это еще одна проблема. – Psidom

ответ

2

это другой подход, который использует Apache Commons. Тем не менее, важно отметить, что операция деления применяется умножение и инверсии операций и некоторые матрицы являются inversable и другие нет: https://en.wikipedia.org/wiki/Invertible_matrix

Следующий пример относится к библиотеке 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)) 

    } 
} 

Совет: Если вы собираетесь использовать консоль SCALA, необходимо указать путь к классам ...

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

... в сессии вы лестница загрузки алгоритма ...

:load .../Study.scala 

... и результаты выходят вызов основной функции изучения (приближение может быть применено) ...

scala> Study.main(null)             

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

1

Try:

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

Библиотека Beeze как mecioned в других ответах, необходимо. Вы можете установить его с помощью SBT или Maven

Проект Breeze можно скачать с GitHub

Это Maven подход:

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

Код ...

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) 
    } 
} 
Смежные вопросы