前回のエントリでND4J
の利用準備をして、ベクトルと行列の定義だけしてみました
今回はベクトルの演算を試してみます。
各種演算
ベクトルの和
ベクトルとベクトルの足し算です。
■サンプルコード
import org.nd4j.linalg.api.ndarray.INDArray; import org.nd4j.linalg.factory.Nd4j; INDArray vectorA = Nd4j.create(new double[]{1.0, 2.0}, new int[]{2, 1}); INDArray vectorB = Nd4j.create(new double[]{5.0, 7.0}, new int[]{2, 1}); // ベクトルの和 INDArray vRet1 = vectorA.add(vectorB); System.out.println("vRet1: \n" + vRet1); System.out.println("vRet1 is Vector?: " + vRet1.isVector());
■実行結果
要素同士の値が足し算されたベクトルの形で結果が出ています
vRet1: [6.00, 9.00] vRet1 is Vector?: true
ベクトルの差
ベクトルとベクトルの引き算です。
■サンプルコード
import org.nd4j.linalg.api.ndarray.INDArray; import org.nd4j.linalg.factory.Nd4j; INDArray vectorA = Nd4j.create(new double[]{1.0, 2.0}, new int[]{2, 1}); INDArray vectorB = Nd4j.create(new double[]{5.0, 7.0}, new int[]{2, 1}); // ベクトルの差 INDArray vRet2 = vectorA.sub(vectorB); System.out.println("vRet2: \n" + vRet2); System.out.println("vRet2 is Vector?: " + vRet2.isVector());
■実行結果
要素同士の値が引き算されたベクトルの形で結果が出ています
vRet2: [-4.00, -5.00] vRet2 is Vector?: true
ベクトル×スカラー
ベクトルをスカラー倍します。
■サンプルコード
import org.nd4j.linalg.api.ndarray.INDArray; import org.nd4j.linalg.factory.Nd4j; INDArray vectorA = Nd4j.create(new double[]{1.0, 2.0}, new int[]{2, 1}); INDArray vRet3 = vectorA.mul(10); System.out.println("vRet3: \n" + vRet3); System.out.println("vRet3 is Vector?: " + vRet3.isVector());
■実行結果
ベクトルの各要素の値がスカラー倍されています
vRet3: [10.00, 20.00] vRet3 is Vector?: true
内積(inner product)
ベクトルの内積は、行ベクトル×列ベクトルの演算を行って値をもとめます
■サンプルコード
import org.nd4j.linalg.api.ndarray.INDArray; import org.nd4j.linalg.factory.Nd4j; // ベクトルの内積(inner product)(行ベクトル×列ベクトル) INDArray rowVector1 = Nd4j.create(new double[]{1.0, 2.0, 3.0}, new int[]{1, 3}); INDArray colVector1 = Nd4j.create(new double[]{4.0, 5.0, 6.0}, new int[]{3, 1}); INDArray vRet4 = rowVector1.mmul(colVector1); System.out.println("vRet4: \n" + vRet4); System.out.println("vRet4 is Scalar? -> " + vRet4.isScalar());
■実行結果
スカラーで対象のベクトルの値が算出されています
vRet4: 32.00 vRet4 is Scalar? -> true
直積(outer product)
ベクトルの直積は、列ベクトル×行ベクトルの演算を行ってもとめます
■サンプルコード
import org.nd4j.linalg.api.ndarray.INDArray; import org.nd4j.linalg.factory.Nd4j; // ベクトルの直積(outer product)(列ベクトル×行ベクトル) INDArray colVector2 = Nd4j.create(new double[]{4.0, 5.0, 6.0}, new int[]{3, 1}); INDArray rowVector2 = Nd4j.create(new double[]{1.0, 2.0, 3.0}, new int[]{1, 3}); INDArray vRet5 = colVector2.mmul(rowVector2); System.out.println("vRet5: \n" + vRet5); System.out.println("vRet5 is Matrix? -> " + vRet5.isMatrix());
■実行結果
vRet5: [[4.00, 8.00, 12.00], [5.00, 10.00, 15.00], [6.00, 12.00, 18.00]] vRet5 is Matrix? -> true
その他
外積(クロス積 cross product)に該当するAPI(いわゆるNumPy
のnumpy.cross
に対応するもの)が良くわからなくて今回試せてません・・・。
ND4Jに対する知識がなさ過ぎて見つけられてません。むしろ誰か教えてください。