Author: jcouteau Date: 2009-03-03 14:01:27 +0000 (Tue, 03 Mar 2009) New Revision: 122 Modified: lutinmatrix/trunk/src/main/java/org/codelutin/math/matrix/MatrixFactory.java lutinmatrix/trunk/src/test/java/org/codelutin/math/matrix/MatrixNDTest.java Log: Correct bug on asymmetrical matrices. Add tests. Modified: lutinmatrix/trunk/src/main/java/org/codelutin/math/matrix/MatrixFactory.java =================================================================== --- lutinmatrix/trunk/src/main/java/org/codelutin/math/matrix/MatrixFactory.java 2009-03-03 10:26:11 UTC (rev 121) +++ lutinmatrix/trunk/src/main/java/org/codelutin/math/matrix/MatrixFactory.java 2009-03-03 14:01:27 UTC (rev 122) @@ -26,190 +26,174 @@ * representation interne des matrices de facon simple. * <p> * Created: 11 octobre 2005 20:15:20 CEST - * + * * @author Benjamin POUSSIN <poussin@codelutin.com> * @version $Revision$ - * - * Last update: $Date$ - * by : $Author$ + * + * Last update: $Date$ by : + * $Author$ */ public class MatrixFactory { // MatrixFactory - /* following code in only an exception generator since - * lutinxml in not used anymore :) - static { + /* + * following code in only an exception generator since lutinxml in not used + * anymore :) static { + * // on essai d'enregistrer le converter XML try { // Il faut le faire par + * pur introspection sinon l'exception // NoClassDefFoundError est levé + * avant d'entrer dans le constructeur // static :( Class converterClass = + * Class .forName("org.codelutin.math.matrix.MatrixNDXMLConverter"); Object + * converter = converterClass.newInstance(); + * + * Class converterFactoryClass = Class + * .forName("org.codelutin.xml.XMLConverterFactory"); Method m = + * converterFactoryClass.getMethod("addConverter", Class.class, Class + * .forName("org.codelutin.xml.XMLConverter")); m.invoke(null, + * MatrixND.class, converter); + * // org.codelutin.xml.XMLConverterFactory.addConverter(MatrixND.class, // + * new MatrixNDXMLConverter()); log.info("Converter XML pour MatrixND + * ajoute"); + * // on essai d'enregistrer le converter JDBC // le JDBC depend du XML try { + * converterClass = Class + * .forName("org.codelutin.math.matrix.MatrixNDJDBCConverter"); converter = + * converterClass.newInstance(); + * + * converterFactoryClass = Class + * .forName("org.codelutin.topia.persistence.jdbctransformer.JDBCTransformerFactory"); + * m = converterFactoryClass .getMethod( "addConverter", Class.class, + * Class.forName("org.codelutin.topia.persistence.jdbctransformer.JDBCTransformer")); + * m.invoke(null, MatrixND.class, converter); + * // Class converterClass = // + * org.codelutin.math.matrix.MatrixNDJDBCConverter(); // + * JDBCTransformerFactory // .addConverter(MatrixND.class, new + * MatrixNDJDBCConverter()); log.info("Converter JDBC pour MatrixND + * ajoute"); } catch (Throwable eee) { log .info("librairie topia non + * presente. Import/Export JDBC impossible"); log.debug("L'exception etait", + * eee); } + * } catch (Throwable eee) { log .info("librairie lutinxml non presente. + * Import/Export XML impossible"); log.debug("L'exception etait", eee); } + * } + */ - // on essai d'enregistrer le converter XML - try { - // Il faut le faire par pur introspection sinon l'exception - // NoClassDefFoundError est levé avant d'entrer dans le constructeur - // static :( - Class converterClass = Class - .forName("org.codelutin.math.matrix.MatrixNDXMLConverter"); - Object converter = converterClass.newInstance(); + /** Valeur par defaut si aucun type de Vector n'est donné */ + protected static Class defaultVectorClass = DoubleBigVector.class; - Class converterFactoryClass = Class - .forName("org.codelutin.xml.XMLConverterFactory"); - Method m = converterFactoryClass.getMethod("addConverter", - Class.class, Class - .forName("org.codelutin.xml.XMLConverter")); - m.invoke(null, MatrixND.class, converter); + protected Class vectorClass = null; - // org.codelutin.xml.XMLConverterFactory.addConverter(MatrixND.class, - // new MatrixNDXMLConverter()); - log.info("Converter XML pour MatrixND ajoute"); + protected MatrixFactory(Class vectorClass) { + this.vectorClass = vectorClass; + } - // on essai d'enregistrer le converter JDBC - // le JDBC depend du XML - try { - converterClass = Class - .forName("org.codelutin.math.matrix.MatrixNDJDBCConverter"); - converter = converterClass.newInstance(); + public static void setDefaultVectorClass(Class vectorClass) { + defaultVectorClass = vectorClass; + } - converterFactoryClass = Class - .forName("org.codelutin.topia.persistence.jdbctransformer.JDBCTransformerFactory"); - m = converterFactoryClass - .getMethod( - "addConverter", - Class.class, - Class.forName("org.codelutin.topia.persistence.jdbctransformer.JDBCTransformer")); - m.invoke(null, MatrixND.class, converter); + public static Class getDefaultVectorClass() { + return defaultVectorClass; + } - // Class converterClass = - // org.codelutin.math.matrix.MatrixNDJDBCConverter(); - // JDBCTransformerFactory - // .addConverter(MatrixND.class, new MatrixNDJDBCConverter()); - log.info("Converter JDBC pour MatrixND ajoute"); - } catch (Throwable eee) { - log - .info("librairie topia non presente. Import/Export JDBC impossible"); - log.debug("L'exception etait", eee); - } + /** + * Retourne une factory utilisant vectorClass comme classe de base a + * l'implantation des matrices + */ + public static MatrixFactory getInstance(Class vectorClass) { + return new MatrixFactory(vectorClass); + } - } catch (Throwable eee) { - log - .info("librairie lutinxml non presente. Import/Export XML impossible"); - log.debug("L'exception etait", eee); - } + /** + * Utilise par defaut {@link FloatBigVector} + */ + public static MatrixFactory getInstance() { + return getInstance(defaultVectorClass); + } - }*/ + public MatrixND create(int[] dim) { + return new MatrixNDImpl(this, dim); + } - /** Valeur par defaut si aucun type de Vector n'est donné */ - protected static Class defaultVectorClass = DoubleBigVector.class; + /** + * Convert a double array into matrix. + * + * @param values + * The values to fill the matrix + * @param dim + * An array representing the dimensions of the matrix + * @return a 2D matrix filled with the values, null if the dimension is more + * than 2 + */ + public MatrixND create(double[] values, int[] dim) { - protected Class vectorClass = null; + if (dim.length > 2) { + return null; + } + MatrixNDImpl matrix = new MatrixNDImpl(this, dim); - protected MatrixFactory(Class vectorClass) { - this.vectorClass = vectorClass; - } + if (dim.length == 2) { + for (int i = 0; i < dim[0]; i++) { + for (int j = 0; j < dim[1]; j++) { + int[] coordinates = { i, j }; + matrix.setValue(coordinates, values[i * dim[1] + j]); + } + } + } + if (dim.length == 1) { + for (int i = 0; i < dim[0]; i++) { + int[] coordinates = { i }; + matrix.setValue(coordinates, values[i]); + } + } - public static void setDefaultVectorClass(Class vectorClass) { - defaultVectorClass = vectorClass; - } + return matrix; + } - public static Class getDefaultVectorClass() { - return defaultVectorClass; - } + public MatrixND create(List[] semantics) { + return new MatrixNDImpl(this, semantics); + } - /** - * Retourne une factory utilisant vectorClass comme classe de base a - * l'implantation des matrices - */ - public static MatrixFactory getInstance(Class vectorClass) { - return new MatrixFactory(vectorClass); - } + public MatrixND create(String name, int[] dim) { + return new MatrixNDImpl(this, name, dim); + } - /** - * Utilise par defaut {@link FloatBigVector} - */ - public static MatrixFactory getInstance() { - return getInstance(defaultVectorClass); - } + public MatrixND create(String name, int[] dim, String[] dimNames) { + return new MatrixNDImpl(this, name, dim, dimNames); + } - public MatrixND create(int[] dim) { - return new MatrixNDImpl(this, dim); - } + public MatrixND create(String name, List[] semantics) { + return new MatrixNDImpl(this, name, semantics); + } - /** - * Convert a double array into matrix. - * - * @param values The values to fill the matrix - * @param dim An array representing the dimensions of the matrix - * @return a 2D matrix filled with the values, null if the dimension is more than 2 - */ - public MatrixND create(double[] values, int[] dim) { + public MatrixND create(String name, List[] semantics, String[] dimNames) { + return new MatrixNDImpl(this, name, semantics, dimNames); + } - if (dim.length > 2) { - return null; - } - MatrixNDImpl matrix = new MatrixNDImpl(this, dim); + public MatrixND create(MatrixND matrix) { + return new MatrixNDImpl(this, matrix); + } - if (dim.length == 2) { - for (int i = 0; i < dim[0]; i++) { - for (int j = 0; j < dim[1]; j++) { - int[] coordinates = { i, j }; - matrix.setValue(coordinates, values[i * dim[0] + j]); - } - } - } - if (dim.length == 1) { - for (int i = 0; i < dim[0]; i++) { - int[] coordinates = { i }; - matrix.setValue(coordinates, values[i]); - } - } + /** + * Crée une nouvelle matrice identité. Une matrice identité est une matrice + * à 2 dimensions dont tous les éléments de la diagonal vaut 1 + * + * @param size + * la taille de la matrice + * @return une nouvelle matrice identité + */ + public MatrixND matrixId(int size) { + MatrixND result = create(new int[] { size, size }); + for (int i = 0; i < size; i++) { + result.setValue(i, i, 1); + } + return result; + } - return matrix; - } + protected Vector createVector(int length) { + try { + Constructor c = vectorClass + .getConstructor(new Class[] { Integer.TYPE }); + return (Vector) c.newInstance(new Object[] { length }); + } catch (Exception eee) { + throw new RuntimeException("Can't create vector", eee); + } + } - public MatrixND create(List[] semantics) { - return new MatrixNDImpl(this, semantics); - } - - public MatrixND create(String name, int[] dim) { - return new MatrixNDImpl(this, name, dim); - } - - public MatrixND create(String name, int[] dim, String[] dimNames) { - return new MatrixNDImpl(this, name, dim, dimNames); - } - - public MatrixND create(String name, List[] semantics) { - return new MatrixNDImpl(this, name, semantics); - } - - public MatrixND create(String name, List[] semantics, String[] dimNames) { - return new MatrixNDImpl(this, name, semantics, dimNames); - } - - public MatrixND create(MatrixND matrix) { - return new MatrixNDImpl(this, matrix); - } - - /** - * Crée une nouvelle matrice identité. Une matrice identité est une matrice - * à 2 dimensions dont tous les éléments de la diagonal vaut 1 - * - * @param size la taille de la matrice - * @return une nouvelle matrice identité - */ - public MatrixND matrixId(int size) { - MatrixND result = create(new int[] { size, size }); - for (int i = 0; i < size; i++) { - result.setValue(i, i, 1); - } - return result; - } - - protected Vector createVector(int length) { - try { - Constructor c = vectorClass - .getConstructor(new Class[] { Integer.TYPE }); - return (Vector) c.newInstance(new Object[] { length }); - } catch (Exception eee) { - throw new RuntimeException("Can't create vector", eee); - } - } - } // MatrixFactory Modified: lutinmatrix/trunk/src/test/java/org/codelutin/math/matrix/MatrixNDTest.java =================================================================== --- lutinmatrix/trunk/src/test/java/org/codelutin/math/matrix/MatrixNDTest.java 2009-03-03 10:26:11 UTC (rev 121) +++ lutinmatrix/trunk/src/test/java/org/codelutin/math/matrix/MatrixNDTest.java 2009-03-03 14:01:27 UTC (rev 122) @@ -543,7 +543,33 @@ Assert.assertEquals(7, (int) mat.getValue(new int[] { 2, 0 })); Assert.assertEquals(8, (int) mat.getValue(new int[] { 2, 1 })); Assert.assertEquals(9, (int) mat.getValue(new int[] { 2, 2 })); + + mat = getFactory().create(new double[] { 1, 2, 3, 4, 5, 6}, + new int[] { 2, 3 }); + Assert.assertEquals(2, mat.getDim().length); + Assert.assertEquals(2, mat.getDim(0)); + Assert.assertEquals(3, mat.getDim(1)); + Assert.assertEquals(1, (int) mat.getValue(new int[] { 0, 0 })); + Assert.assertEquals(2, (int) mat.getValue(new int[] { 0, 1 })); + Assert.assertEquals(3, (int) mat.getValue(new int[] { 0, 2 })); + Assert.assertEquals(4, (int) mat.getValue(new int[] { 1, 0 })); + Assert.assertEquals(5, (int) mat.getValue(new int[] { 1, 1 })); + Assert.assertEquals(6, (int) mat.getValue(new int[] { 1, 2 })); + + mat = getFactory().create(new double[] { 1, 2, 3, 4, 5, 6}, + new int[] { 3, 2 }); + + Assert.assertEquals(2, mat.getDim().length); + Assert.assertEquals(3, mat.getDim(0)); + Assert.assertEquals(2, mat.getDim(1)); + Assert.assertEquals(1, (int) mat.getValue(new int[] { 0, 0 })); + Assert.assertEquals(2, (int) mat.getValue(new int[] { 0, 1 })); + Assert.assertEquals(3, (int) mat.getValue(new int[] { 1, 0 })); + Assert.assertEquals(4, (int) mat.getValue(new int[] { 1, 1 })); + Assert.assertEquals(5, (int) mat.getValue(new int[] { 2, 0 })); + Assert.assertEquals(6, (int) mat.getValue(new int[] { 2, 1 })); + mat = getFactory().create(new double[] { 1, 2, 3 }, new int[] { 3 }); Assert.assertEquals(1, mat.getDim().length); Assert.assertEquals(3, mat.getDim(0));