前回のエントリでND4J
を利用して、Javaプログラムでの行列の演算を試しました
今回は行列の演算をScalaから実行してみます。
準備
開発はsbtを用います。
build.sbtに以下を追記します
libraryDependencies ++= Seq( "org.nd4j" % "nd4j-native-platform" % "0.7.2", "org.slf4j" % "slf4j-api" % "1.7.22", "ch.qos.logback" % "logback-classic" % "1.1.8" )
各種演算
行列の和
行列と行列の足し算です。
■サンプルコード
import org.nd4j.linalg.factory.Nd4j val matrixA = Nd4j.create(Array(1.0, 2.0, 3.0, 4.0), Array(2, 2)) val matrixB = Nd4j.create(Array(11.0, 12.0, 13.0, 14.0), Array(2, 2)) val matrixRet1 = matrixA.add(matrixB) println("Ret1: \n" + matrixRet1)
■実行結果
Ret1: [[12.00, 14.00], [16.00, 18.00]]
行列の差
行列と行列の引き算です。
■サンプルコード
import org.nd4j.linalg.factory.Nd4j val matrixA = Nd4j.create(Array(1.0, 2.0, 3.0, 4.0), Array(2, 2)) val matrixB = Nd4j.create(Array(11.0, 12.0, 13.0, 14.0), Array(2, 2)) val matrixRet2 = matrixA.sub(matrixB) println("Ret2: \n" + matrixRet2)
■実行結果
Ret2: [[-10.00, -10.00], [-10.00, -10.00]]
行列×スカラー
行列をスカラー倍します。
■サンプルコード
import org.nd4j.linalg.factory.Nd4j val matrixA = Nd4j.create(Array(1.0, 2.0, 3.0, 4.0), Array(2, 2)) val matrixRet3 = matrixA.mul(3) println("Ret3: \n" + matrixRet3)
■実行結果
Ret3: [[3.00, 6.00], [9.00, 12.00]]
行列と行列の積
行列と行列のかけ算です
■サンプルコード
import org.nd4j.linalg.factory.Nd4j val matrixA = Nd4j.create(Array(1.0, 2.0, 3.0, 4.0), Array(2, 2)) val matrixB = Nd4j.create(Array(11.0, 12.0, 13.0, 14.0), Array(2, 2)) val matrixRet4 = matrixA.mmul(matrixB) println("Ret4: \n" + matrixRet4)
■実行結果
Ret4: [[37.00, 40.00], [85.00, 92.00]]
零行列との積
行列と零行列のかけ算です
■サンプルコード
import org.nd4j.linalg.factory.Nd4j val matrixA = Nd4j.create(Array(1.0, 2.0, 3.0, 4.0), Array(2, 2)) val zeroMatrix = Nd4j.zeros(2, 2) val matrixRet5 = matrixA.mmul(zeroMatrix) println("Ret5: \n" + matrixRet5)
■実行結果
[[0.00, 0.00], [0.00, 0.00]]
単位行列との積
行列と単位行列のかけ算です
■サンプルコード
import org.nd4j.linalg.factory.Nd4j val matrixA = Nd4j.create(Array(1.0, 2.0, 3.0, 4.0), Array(2, 2)) val identityMatrix = Nd4j.eye(2) val matrixRet6 = matrixA.mmul(identityMatrix) println("Ret6: \n" + matrixRet6)
■実行結果
Ret6: [[1.00, 2.00], [3.00, 4.00]]
転置行列
対象行列Cの転置行列を求めます
■サンプルコード
import org.nd4j.linalg.factory.Nd4j val matrixC = Nd4j.create(Array(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0), Array(3, 3)) val matrixRet7 = matrixC.transpose() println("Raw Matrix: \n" + matrixC) println("Transposed Matrix: \n" + matrixRet7)
■実行結果
Raw Matrix: [[1.00, 2.00, 3.00], [4.00, 5.00, 6.00], [7.00, 8.00, 9.00]] Transposed Matrix: [[1.00, 4.00, 7.00], [2.00, 5.00, 8.00], [3.00, 6.00, 9.00]]
逆行列
対象行列Aの逆行列を求めます
■サンプルコード
import org.nd4j.linalg.factory.Nd4j import org.nd4j.linalg.inverse.InvertMatrix val matrixC = Nd4j.create(Array(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0), Array(3, 3)) val matrixRet8 = InvertMatrix.invert(matrixA, false) println("Raw Matrix: \n" + matrixA) println("Invert Matrix: \n" + matrixRet8) // 元の行列×逆行列=単位行列 println("identity Matrix: \n" + matrixA.mmul(matrixRet8))
■実行結果
Raw Matrix: [[1.00, 2.00], [3.00, 4.00]] Invert Matrix: [[-2.00, 1.00], [1.50, -0.50]] identity Matrix: [[1.00, 0.00], [0.00, 1.00]]