diff --git a/libraries-2/pom.xml b/libraries-2/pom.xml
index 32f3f23812..c18b4aae64 100644
--- a/libraries-2/pom.xml
+++ b/libraries-2/pom.xml
@@ -50,6 +50,26 @@
picocli
${picocli.version}
+
+ org.ejml
+ ejml-all
+ ${ejml.version}
+
+
+ org.nd4j
+ nd4j-native
+ ${nd4j.version}
+
+
+ org.la4j
+ la4j
+ ${la4j.version}
+
+
+ colt
+ colt
+ ${colt.version}
+
org.springframework.boot
spring-boot-starter
@@ -93,10 +113,22 @@
test
-
- edu.uci.ics
- crawler4j
- ${crawler4j.version}
+
+ edu.uci.ics
+ crawler4j
+ ${crawler4j.version}
+
+
+
+
+ org.openjdk.jmh
+ jmh-core
+ ${jmh.version}
+
+
+ org.openjdk.jmh
+ jmh-generator-annprocess
+ ${jmh.version}
@@ -109,5 +141,10 @@
3.17.2
4.4.0
2.1.4.RELEASE
+ 0.38
+ 1.0.0-beta4
+ 1.2.0
+ 0.6.0
+ 1.19
diff --git a/libraries-2/src/test/java/com/baeldung/matrices/MatrixMultiplicationBenchmarking.java b/libraries-2/src/test/java/com/baeldung/matrices/MatrixMultiplicationBenchmarking.java
new file mode 100644
index 0000000000..1e3b183aa7
--- /dev/null
+++ b/libraries-2/src/test/java/com/baeldung/matrices/MatrixMultiplicationBenchmarking.java
@@ -0,0 +1,9 @@
+package com.baeldung.matrices;
+
+public class MatrixMultiplicationBenchmarking {
+
+ public static void main(String[] args) throws Exception {
+ org.openjdk.jmh.Main.main(args);
+ }
+
+}
diff --git a/libraries-2/src/test/java/com/baeldung/matrices/apache/RealMatrixUnitTest.java b/libraries-2/src/test/java/com/baeldung/matrices/apache/RealMatrixUnitTest.java
new file mode 100644
index 0000000000..05944e7b3a
--- /dev/null
+++ b/libraries-2/src/test/java/com/baeldung/matrices/apache/RealMatrixUnitTest.java
@@ -0,0 +1,47 @@
+package com.baeldung.matrices.apache;
+
+import org.apache.commons.math3.linear.Array2DRowRealMatrix;
+import org.apache.commons.math3.linear.RealMatrix;
+import org.junit.jupiter.api.Test;
+import org.openjdk.jmh.annotations.*;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+@BenchmarkMode(Mode.AverageTime)
+@Fork(value = 2)
+@Warmup(iterations = 5)
+@Measurement(iterations = 10)
+public class RealMatrixUnitTest {
+
+ @Test
+ @Benchmark
+ public void givenTwoMatrices_whenMultiply_thenMultiplicatedMatrix() {
+ RealMatrix firstMatrix = new Array2DRowRealMatrix(
+ new double[][] {
+ new double[] {1d, 5d},
+ new double[] {2d, 3d},
+ new double[] {1d ,7d}
+ }
+ );
+
+ RealMatrix secondMatrix = new Array2DRowRealMatrix(
+ new double[][] {
+ new double[] {1d, 2d, 3d, 7d},
+ new double[] {5d, 2d, 8d, 1d}
+ }
+ );
+
+ RealMatrix expected = new Array2DRowRealMatrix(
+ new double[][] {
+ new double[] {26d, 12d, 43d, 12d},
+ new double[] {17d, 10d, 30d, 17d},
+ new double[] {36d, 16d, 59d, 14d}
+ }
+ );
+
+ RealMatrix actual = firstMatrix.multiply(secondMatrix);
+
+ assertThat(actual).isEqualTo(expected);
+ }
+
+}
diff --git a/libraries-2/src/test/java/com/baeldung/matrices/colt/DoubleMatrix2DUnitTest.java b/libraries-2/src/test/java/com/baeldung/matrices/colt/DoubleMatrix2DUnitTest.java
new file mode 100644
index 0000000000..fb4a419eb0
--- /dev/null
+++ b/libraries-2/src/test/java/com/baeldung/matrices/colt/DoubleMatrix2DUnitTest.java
@@ -0,0 +1,51 @@
+package com.baeldung.matrices.colt;
+
+import cern.colt.matrix.DoubleFactory2D;
+import cern.colt.matrix.DoubleMatrix2D;
+import cern.colt.matrix.linalg.Algebra;
+import org.junit.jupiter.api.Test;
+import org.openjdk.jmh.annotations.*;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+@BenchmarkMode(Mode.AverageTime)
+@Fork(value = 2)
+@Warmup(iterations = 5)
+@Measurement(iterations = 10)
+public class DoubleMatrix2DUnitTest {
+
+ @Test
+ @Benchmark
+ public void givenTwoMatrices_whenMultiply_thenMultiplicatedMatrix() {
+ DoubleFactory2D doubleFactory2D = DoubleFactory2D.dense;
+
+ DoubleMatrix2D firstMatrix = doubleFactory2D.make(
+ new double[][] {
+ new double[] {1d, 5d},
+ new double[] {2d, 3d},
+ new double[] {1d ,7d}
+ }
+ );
+
+ DoubleMatrix2D secondMatrix = doubleFactory2D.make(
+ new double[][] {
+ new double[] {1d, 2d, 3d, 7d},
+ new double[] {5d, 2d, 8d, 1d}
+ }
+ );
+
+ DoubleMatrix2D expected = doubleFactory2D.make(
+ new double[][] {
+ new double[] {26d, 12d, 43d, 12d},
+ new double[] {17d, 10d, 30d, 17d},
+ new double[] {36d, 16d, 59d, 14d}
+ }
+ );
+
+ Algebra algebra = new Algebra();
+ DoubleMatrix2D actual = algebra.mult(firstMatrix, secondMatrix);
+
+ assertThat(actual).isEqualTo(expected);
+ }
+
+}
diff --git a/libraries-2/src/test/java/com/baeldung/matrices/ejml/SimpleMatrixUnitTest.java b/libraries-2/src/test/java/com/baeldung/matrices/ejml/SimpleMatrixUnitTest.java
new file mode 100644
index 0000000000..b025266a1d
--- /dev/null
+++ b/libraries-2/src/test/java/com/baeldung/matrices/ejml/SimpleMatrixUnitTest.java
@@ -0,0 +1,46 @@
+package com.baeldung.matrices.ejml;
+
+import org.ejml.simple.SimpleMatrix;
+import org.junit.jupiter.api.Test;
+import org.openjdk.jmh.annotations.*;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+@BenchmarkMode(Mode.AverageTime)
+@Fork(value = 2)
+@Warmup(iterations = 5)
+@Measurement(iterations = 10)
+public class SimpleMatrixUnitTest {
+
+ @Test
+ @Benchmark
+ public void givenTwoMatrices_whenMultiply_thenMultiplicatedMatrix() {
+ SimpleMatrix firstMatrix = new SimpleMatrix(
+ new double[][] {
+ new double[] {1d, 5d},
+ new double[] {2d, 3d},
+ new double[] {1d ,7d}
+ }
+ );
+
+ SimpleMatrix secondMatrix = new SimpleMatrix(
+ new double[][] {
+ new double[] {1d, 2d, 3d, 7d},
+ new double[] {5d, 2d, 8d, 1d}
+ }
+ );
+
+ SimpleMatrix expected = new SimpleMatrix(
+ new double[][] {
+ new double[] {26d, 12d, 43d, 12d},
+ new double[] {17d, 10d, 30d, 17d},
+ new double[] {36d, 16d, 59d, 14d}
+ }
+ );
+
+ SimpleMatrix actual = firstMatrix.mult(secondMatrix);
+
+ assertThat(actual).matches(m -> m.isIdentical(expected, 0d));
+ }
+
+}
diff --git a/libraries-2/src/test/java/com/baeldung/matrices/homemade/HomemadeMatrixUnitTest.java b/libraries-2/src/test/java/com/baeldung/matrices/homemade/HomemadeMatrixUnitTest.java
new file mode 100644
index 0000000000..be9e483d5b
--- /dev/null
+++ b/libraries-2/src/test/java/com/baeldung/matrices/homemade/HomemadeMatrixUnitTest.java
@@ -0,0 +1,58 @@
+package com.baeldung.matrices.homemade;
+
+import org.junit.jupiter.api.Test;
+import org.openjdk.jmh.annotations.*;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+@BenchmarkMode(Mode.AverageTime)
+@Fork(value = 2)
+@Warmup(iterations = 5)
+@Measurement(iterations = 10)
+public class HomemadeMatrixUnitTest {
+
+ @Test
+ @Benchmark
+ public void givenTwoMatrices_whenMultiply_thenMultiplicatedMatrix() {
+ double[][] firstMatrix = {
+ new double[]{1d, 5d},
+ new double[]{2d, 3d},
+ new double[]{1d, 7d}
+ };
+
+ double[][] secondMatrix = {
+ new double[]{1d, 2d, 3d, 7d},
+ new double[]{5d, 2d, 8d, 1d}
+ };
+
+ double[][] expected = {
+ new double[]{26d, 12d, 43d, 12d},
+ new double[]{17d, 10d, 30d, 17d},
+ new double[]{36d, 16d, 59d, 14d}
+ };
+
+ double[][] actual = multiplyMatrices(firstMatrix, secondMatrix);
+
+ assertThat(actual).isEqualTo(expected);
+ }
+
+ private double[][] multiplyMatrices(double[][] firstMatrix, double[][] secondMatrix) {
+ double[][] result = new double[firstMatrix.length][secondMatrix[0].length];
+
+ for (int row = 0; row < result.length; row++) {
+ for (int col = 0; col < result[row].length; col++) {
+ result[row][col] = multiplyMatricesCell(firstMatrix, secondMatrix, row, col);
+ }
+ }
+
+ return result;
+ }
+
+ private double multiplyMatricesCell(double[][] firstMatrix, double[][] secondMatrix, int row, int col) {
+ double cell = 0;
+ for (int i = 0; i < secondMatrix.length; i++) {
+ cell += firstMatrix[row][i] * secondMatrix[i][col];
+ }
+ return cell;
+ }
+}
diff --git a/libraries-2/src/test/java/com/baeldung/matrices/la4j/Basic2DMatrixUnitTest.java b/libraries-2/src/test/java/com/baeldung/matrices/la4j/Basic2DMatrixUnitTest.java
new file mode 100644
index 0000000000..afb84ff3db
--- /dev/null
+++ b/libraries-2/src/test/java/com/baeldung/matrices/la4j/Basic2DMatrixUnitTest.java
@@ -0,0 +1,47 @@
+package com.baeldung.matrices.la4j;
+
+import org.junit.jupiter.api.Test;
+import org.la4j.Matrix;
+import org.la4j.matrix.dense.Basic2DMatrix;
+import org.openjdk.jmh.annotations.*;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+@BenchmarkMode(Mode.AverageTime)
+@Fork(value = 2)
+@Warmup(iterations = 5)
+@Measurement(iterations = 10)
+public class Basic2DMatrixUnitTest {
+
+ @Test
+ @Benchmark
+ public void givenTwoMatrices_whenMultiply_thenMultiplicatedMatrix() {
+ Matrix firstMatrix = new Basic2DMatrix(
+ new double[][]{
+ new double[]{1d, 5d},
+ new double[]{2d, 3d},
+ new double[]{1d, 7d}
+ }
+ );
+
+ Matrix secondMatrix = new Basic2DMatrix(
+ new double[][]{
+ new double[]{1d, 2d, 3d, 7d},
+ new double[]{5d, 2d, 8d, 1d}
+ }
+ );
+
+ Matrix expected = new Basic2DMatrix(
+ new double[][]{
+ new double[]{26d, 12d, 43d, 12d},
+ new double[]{17d, 10d, 30d, 17d},
+ new double[]{36d, 16d, 59d, 14d}
+ }
+ );
+
+ Matrix actual = firstMatrix.multiply(secondMatrix);
+
+ assertThat(actual).isEqualTo(expected);
+ }
+
+}
diff --git a/libraries-2/src/test/java/com/baeldung/matrices/nd4j/INDArrayUnitTest.java b/libraries-2/src/test/java/com/baeldung/matrices/nd4j/INDArrayUnitTest.java
new file mode 100644
index 0000000000..fb3030bccf
--- /dev/null
+++ b/libraries-2/src/test/java/com/baeldung/matrices/nd4j/INDArrayUnitTest.java
@@ -0,0 +1,46 @@
+package com.baeldung.matrices.nd4j;
+
+import org.junit.jupiter.api.Test;
+import org.nd4j.linalg.api.ndarray.INDArray;
+import org.nd4j.linalg.factory.Nd4j;
+import org.openjdk.jmh.annotations.*;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+@BenchmarkMode(Mode.AverageTime)
+@Fork(value = 2)
+@Warmup(iterations = 5)
+@Measurement(iterations = 10)
+public class INDArrayUnitTest {
+
+ @Test
+ public void givenTwoMatrices_whenMultiply_thenMultiplicatedMatrix() {
+ INDArray firstMatrix = Nd4j.create(
+ new double[][]{
+ new double[]{1d, 5d},
+ new double[]{2d, 3d},
+ new double[]{1d, 7d}
+ }
+ );
+
+ INDArray secondMatrix = Nd4j.create(
+ new double[][] {
+ new double[] {1d, 2d, 3d, 7d},
+ new double[] {5d, 2d, 8d, 1d}
+ }
+ );
+
+ INDArray expected = Nd4j.create(
+ new double[][] {
+ new double[] {26d, 12d, 43d, 12d},
+ new double[] {17d, 10d, 30d, 17d},
+ new double[] {36d, 16d, 59d, 14d}
+ }
+ );
+
+ INDArray actual = firstMatrix.mmul(secondMatrix);
+
+ assertThat(actual).isEqualTo(expected);
+ }
+
+}