From a3487d510825ab13801c0d7e742ad150b26a22c8 Mon Sep 17 00:00:00 2001 From: fefe <hofer.francois.01@gmail.com> Date: Thu, 9 Jan 2020 18:10:09 +0100 Subject: [PATCH] Done the basics of matrix, .det() stil not passing tests --- src/main/java/ch/hepia/numeric/Matrix.java | 104 +++++++++++++++----- src/test/java/ch/hepia/numeric/AppTest.java | 66 +++++++++++++ 2 files changed, 146 insertions(+), 24 deletions(-) diff --git a/src/main/java/ch/hepia/numeric/Matrix.java b/src/main/java/ch/hepia/numeric/Matrix.java index 4902e3b..30b9c0a 100644 --- a/src/main/java/ch/hepia/numeric/Matrix.java +++ b/src/main/java/ch/hepia/numeric/Matrix.java @@ -3,29 +3,41 @@ import java.util.List; import java.util.ArrayList; import java.util.function.BiFunction; import java.util.function.DoubleFunction; - +import ch.hepia.numeric.Vector; public class Matrix { + private List<Vector> col; + private Matrix(List<Vector> vecLst){ + this.col = vecLst; + } public int nbRows() { - throw new UnsupportedOperationException("This feature isn't implemented yet"); + return this.col.get(0).len(); } public int nbCols() { - throw new UnsupportedOperationException("This feature isn't implemented yet"); + return this.cols().size(); } public List<Vector> cols() { - throw new UnsupportedOperationException("This feature isn't implemented yet"); - } - public List<Transposed> rows() { - throw new UnsupportedOperationException("This feature isn't implemented yet"); + return this.col; + } + public List<Transposed> rows(){ + List<Transposed> lstTran = new ArrayList<>(); + for(int i = 0;i < this.nbRows();i++){ + List<Double> newTran = new ArrayList<>(); + for (Vector x : this.cols()){ + newTran.add(x.get(i)); + } + lstTran.add(new Transposed(newTran)); + } + return lstTran; } public Transposed getRow(int i) { - throw new UnsupportedOperationException("This feature isn't implemented yet"); + return this.rows().get(i); } public Vector getCol(int i) { - throw new UnsupportedOperationException("This feature isn't implemented yet"); + return cols().get(i); } public double get(int i, int j) { - throw new UnsupportedOperationException("This feature isn't implemented yet"); + return this.cols().get(i).get(j); } void set(int row, int col, double value) { throw new UnsupportedOperationException("This feature isn't implemented yet"); @@ -37,7 +49,11 @@ public class Matrix { throw new UnsupportedOperationException("This feature isn't implemented yet"); } public Matrix mul(double d) { - throw new UnsupportedOperationException("This feature isn't implemented yet"); + List<Vector> lstVec = new ArrayList<>(); + for (int i = 0; i < this.cols().size();i++){ + lstVec.add(this.cols().get(i).mul(d)); + } + return Matrix.of(lstVec); } public Matrix mul(Matrix that) { throw new UnsupportedOperationException("This feature isn't implemented yet"); @@ -46,7 +62,11 @@ public class Matrix { throw new UnsupportedOperationException("This feature isn't implemented yet"); } public boolean isSquare() { - throw new UnsupportedOperationException("This feature isn't implemented yet"); + if (this.nbCols() == this.nbRows()) + { + return true; + } + return false; } public Matrix t() { throw new UnsupportedOperationException("This feature isn't implemented yet"); @@ -58,7 +78,19 @@ public class Matrix { throw new UnsupportedOperationException("This feature isn't implemented yet"); } public Matrix removed(int i, int j) { - throw new UnsupportedOperationException("This feature isn't implemented yet"); + List<Vector> lstVec = new ArrayList<>(); + for (int x = 0; x < this.nbCols(); x++){ + List<Double> newVec = new ArrayList<>(); + for (int y = 0; y < this.nbRows(); y++){ + if ( x != i && y != j){ + newVec.add(this.get(x, y)); + } + } + if (newVec.size() > 0){ + lstVec.add(Vector.of(newVec)); + } + } + return Matrix.of(lstVec); } public Matrix adjugate() { @@ -78,7 +110,7 @@ public class Matrix { public double det() { if (!isSquare()) { - /* do something smart */ + //throw new Exception(""); } if( nbCols() == 1) { @@ -86,11 +118,16 @@ public class Matrix { } else if( nbCols() == 2 ){ return get(0,0)*get(1,1) - get(1,0)*get(0,1); } else { - /* A vous de jouer */ - - - - throw new UnsupportedOperationException("This feature isn't implemented yet"); + double tot = 0.0; + for (int i = 0; i < this.nbCols();i++){ + if (i+this.nbCols() % 2 == 0){ + tot += this.removed(i, 0).mul(this.get(i, 0)).det(); + } + else{ + tot -= this.removed(i, 0).mul(this.get(i, 0)).det(); + } + } + return tot; } } @@ -100,18 +137,37 @@ public class Matrix { @Override public String toString() { - throw new UnsupportedOperationException("This feature isn't implemented yet"); + String str = ""; + for (Vector x : this.cols()){ + str += "\n" + x.toString(); + } + return str; } @Override public boolean equals(Object obj) { - throw new UnsupportedOperationException("This feature isn't implemented yet"); + if (this == obj) return true; + if (obj == null || obj.getClass() != this.getClass()) { + return false; + } + Matrix mat = (Matrix) obj; + if (mat.nbRows() != this.nbRows() || mat.nbCols() != this.nbCols()){ + return false; + } + for (int i = 0; i < this.nbCols();i++){ + for (int j = 0; j < this.nbRows();j++){ + if (this.get(i, j) != mat.get(i, j)){ + return false; + } + } + } + return true; } - public static Matrix of(List<Transposed> ts) { - throw new UnsupportedOperationException("This feature isn't implemented yet"); + public static Matrix of(List<Vector> ts) { + return new Matrix(ts); } - public static Matrix of(Transposed... ts) { + public static Matrix of(Vector... ts) { throw new UnsupportedOperationException("This feature isn't implemented yet"); } public static Matrix empty() { diff --git a/src/test/java/ch/hepia/numeric/AppTest.java b/src/test/java/ch/hepia/numeric/AppTest.java index cce66c1..d755632 100644 --- a/src/test/java/ch/hepia/numeric/AppTest.java +++ b/src/test/java/ch/hepia/numeric/AppTest.java @@ -2,6 +2,8 @@ package ch.hepia.numeric; import org.junit.jupiter.api.Test; +import java.util.ArrayList; + //import sun.jvmstat.monitor.VmIdentifier; import java.util.List; @@ -144,4 +146,68 @@ class VectorTest { assertEquals(Vector.fill(4).withValue(1.5), Vector.of(1.5, 1.5, 1.5, 1.5)); assertEquals(Vector.fill(2).withValue(1.0), Vector.of(1.0, 1.0)); } + + @Test + void vectorLinespacev2() { + assertEquals(Vector.from(0.0).to(1.0).repeat(3), Vector.of(0.0, 0.5, 1.0)); + assertEquals(Vector.from(0.0).to(1.0).repeat(5), Vector.of(0.0, 0.25, 0.5, 0.75, 1.0)); + } +// Matrix +@Test + void matrixCreation() { + List<Vector> lstVec = new ArrayList<>(); + lstVec.add(Vector.of(1.0,1.0,1.0)); + lstVec.add(Vector.of(1.0,1.0,1.0)); + lstVec.add(Vector.of(1.0,1.0,1.0)); + Matrix mat = Matrix.of(lstVec); + assertEquals(Matrix.of(lstVec), Matrix.of(lstVec)); + assertEquals(Matrix.of(lstVec), Matrix.of(lstVec)); + assertEquals(Matrix.of(lstVec).nbCols(), 3); + assertEquals(Matrix.of(lstVec).nbRows(), 3); + } + + @Test + void matrixRemoved() { + List<Vector> lstVec = new ArrayList<>(); + lstVec.add(Vector.of(1.0,2.0,3.0)); + lstVec.add(Vector.of(4.0,5.0,6.0)); + lstVec.add(Vector.of(7.0,8.0,9.0)); + Matrix mat = Matrix.of(lstVec); + lstVec = new ArrayList<>(); + lstVec.add(Vector.of(5.0,6.0)); + lstVec.add(Vector.of(8.0,9.0)); + assertEquals(mat.removed(0, 0), Matrix.of(lstVec)); + + } + + + @Test + void matrixMul() { + List<Vector> lstVec = new ArrayList<>(); + lstVec.add(Vector.of(1.0,4.0,7.0)); + lstVec.add(Vector.of(2.0,5.0,8.0)); + lstVec.add(Vector.of(3.0,6.0,9.0)); + Matrix mat = Matrix.of(lstVec); + lstVec = new ArrayList<>(); + lstVec.add(Vector.of(2.0,8.0,14.0)); + lstVec.add(Vector.of(4.0,10.0,16.0)); + lstVec.add(Vector.of(6.0,12.0,18.0)); + assertEquals(mat.mul(2.0), Matrix.of(lstVec)); + lstVec = new ArrayList<>(); + lstVec.add(Vector.of(3.0,12.0,21.0)); + lstVec.add(Vector.of(6.0,15.0,24.0)); + lstVec.add(Vector.of(9.0,18.0,27.0)); + assertEquals(mat.mul(3.0), Matrix.of(lstVec)); + } + @Test + void matrixDet() { + List<Vector> lstVec = new ArrayList<>(); + lstVec.add(Vector.of(1.0,4.0,7.0)); + lstVec.add(Vector.of(2.0,5.0,8.0)); + lstVec.add(Vector.of(3.0,6.0,9.0)); + Matrix mat = Matrix.of(lstVec); + assertEquals(mat.det(), 0.0); + + + } } -- GitLab