Index: lutinmatrix/src/java/org/codelutin/math/matrix/AbstractMatrixND.java diff -u lutinmatrix/src/java/org/codelutin/math/matrix/AbstractMatrixND.java:1.5 lutinmatrix/src/java/org/codelutin/math/matrix/AbstractMatrixND.java:1.6 --- lutinmatrix/src/java/org/codelutin/math/matrix/AbstractMatrixND.java:1.5 Wed Oct 5 20:25:05 2005 +++ lutinmatrix/src/java/org/codelutin/math/matrix/AbstractMatrixND.java Thu Oct 20 20:58:04 2005 @@ -23,9 +23,9 @@ * Created: 29 oct. 2004 * * @author Benjamin Poussin - * @version $Revision: 1.5 $ + * @version $Revision: 1.6 $ * - * Mise a jour: $Date: 2005/10/05 20:25:05 $ + * Mise a jour: $Date: 2005/10/20 20:58:04 $ * par : $Author: bpoussin $ */ @@ -40,16 +40,17 @@ public abstract class AbstractMatrixND implements MatrixND { // AbstractMatrixND abstract public MatrixIterator iterator(); - abstract public float getValue(int [] coordinates); - abstract public void setValue(int [] coordinates, float d); + abstract public double getValue(int [] coordinates); + abstract public void setValue(int [] coordinates, double d); protected DimensionHelper dimHelper = new DimensionHelper(); + protected MatrixFactory factory = null; protected int [] dim = null; protected List[] semantics = null; protected String name = ""; protected String [] dimNames = null; - protected float defaultValue = 0; + protected double defaultValue = 0; protected void init(int [] dim){ this.dim = new int[dim.length]; @@ -60,16 +61,20 @@ Arrays.fill(dimNames, ""); } - protected AbstractMatrixND(){} + protected AbstractMatrixND(MatrixFactory factory){ + this.factory = factory; + } - public AbstractMatrixND(int [] dim){ + public AbstractMatrixND(MatrixFactory factory, int [] dim){ + this(factory); init(dim); for(int i=0; i - * @version $Revision: 1.3 $ + * @version $Revision: 1.4 $ * - * Mise a jour: $Date: 2005/10/05 20:25:05 $ + * Mise a jour: $Date: 2005/10/20 20:58:04 $ * par : $Author: bpoussin $ */ @@ -36,15 +36,17 @@ import org.codelutin.i18n.I18n; /** -* Objet matrice qui ne permet que le stockage de float dans un matrice à +* Objet matrice qui ne permet que le stockage de double dans un matrice à * autant de dimension que l'on souhaite. */ public class BasicMatrix { // BasicMatrix + /** La factory */ + protected MatrixFactory factory = null; /** Les dimensions de la matrice */ protected int [] dimensions = null; /** La matrice en représentation linéaire */ - protected float [] data = null; + protected Vector data = null; /** tableau de facteur permettant de convertir les coordonnées dans la * matrice en un indice dans la représentation linéaire de la matrice */ protected int [] linearFactor = null; @@ -52,7 +54,8 @@ /** * Crée une nouvelle matrice ayant les dimensions demandées */ - public BasicMatrix(int [] dimensions){ + public BasicMatrix(MatrixFactory factory, int [] dimensions){ + this.factory = factory; checkDim(dimensions); // copie des dimensions pour que personne à l'extérieur de l'objet @@ -68,7 +71,7 @@ } // creation de la matrice lineaire - data = new float[linearFactor[0] * dimensions[0]]; + data = factory.createVector(linearFactor[0] * dimensions[0]); } /** @@ -78,8 +81,8 @@ * @return la valeur la plus nombreuse dans la matrice, ou la plus petite * si plusieurs valeur se retourve le même nombre de fois */ - public float getMaxOccurence(){ - return MatrixHelper.maxOccurence(data); + public double getMaxOccurence(){ + return data.getMaxOccurence(); } /** @@ -114,9 +117,9 @@ * Retourne un element de la matrice * @param pos la position de l'element à retourner */ - public float getValue(int [] pos){ + public double getValue(int [] pos){ int indice = coordonatesToLinear(pos); - return data[indice]; + return data.getValue(indice); } /** @@ -124,9 +127,9 @@ * @param pos la position de l'element à modifier * @param value la nouvelle valeur à mettre dans la matrice */ - public void setValue(int [] pos, float value){ + public void setValue(int [] pos, double value){ int indice = coordonatesToLinear(pos); - data[indice] = value; + data.setValue(indice, value); } /** @@ -143,9 +146,13 @@ * @param f la fonction a appliquer à chaque élement de la matrice */ public void map(MapFunction f){ - for(int i=0; i - * @version $Revision: 1.2 $ + * @version $Revision: 1.3 $ * - * Mise a jour: $Date: 2005/10/05 20:25:05 $ + * Mise a jour: $Date: 2005/10/20 20:58:04 $ * par : $Author: bpoussin $ */ @@ -52,12 +52,12 @@ /** * Retourne la valeur courant pointé par l'iterator */ - public float getValue(); + public double getValue(); /** * Modifie la valeur courant pointé par l'iterator */ - public void setValue(float value); + public void setValue(double value); } // BasicMatrixIterator Index: lutinmatrix/src/java/org/codelutin/math/matrix/MapFunction.java diff -u lutinmatrix/src/java/org/codelutin/math/matrix/MapFunction.java:1.2 lutinmatrix/src/java/org/codelutin/math/matrix/MapFunction.java:1.3 --- lutinmatrix/src/java/org/codelutin/math/matrix/MapFunction.java:1.2 Wed Oct 5 20:25:05 2005 +++ lutinmatrix/src/java/org/codelutin/math/matrix/MapFunction.java Thu Oct 20 20:58:04 2005 @@ -23,9 +23,9 @@ * Created: 27 oct. 2004 * * @author Benjamin Poussin - * @version $Revision: 1.2 $ + * @version $Revision: 1.3 $ * - * Mise a jour: $Date: 2005/10/05 20:25:05 $ + * Mise a jour: $Date: 2005/10/20 20:58:04 $ * par : $Author: bpoussin $ */ @@ -40,7 +40,7 @@ * @return la nouvelle valeur à mettre dans la matrice à la place de * l'ancienne. */ - public float apply(float value); + public double apply(double value); } // MapFunction Index: lutinmatrix/src/java/org/codelutin/math/matrix/MatrixHelper.java diff -u lutinmatrix/src/java/org/codelutin/math/matrix/MatrixHelper.java:1.5 lutinmatrix/src/java/org/codelutin/math/matrix/MatrixHelper.java:1.6 --- lutinmatrix/src/java/org/codelutin/math/matrix/MatrixHelper.java:1.5 Wed Oct 5 20:25:05 2005 +++ lutinmatrix/src/java/org/codelutin/math/matrix/MatrixHelper.java Thu Oct 20 20:58:04 2005 @@ -23,9 +23,9 @@ * Created: 28 oct. 2004 * * @author Benjamin Poussin - * @version $Revision: 1.5 $ + * @version $Revision: 1.6 $ * - * Mise a jour: $Date: 2005/10/05 20:25:05 $ + * Mise a jour: $Date: 2005/10/20 20:58:04 $ * par : $Author: bpoussin $ */ @@ -155,28 +155,28 @@ * @param value la valeur de remplissage * @return la matrice passé en paramètre */ - static public MatrixND fill(MatrixND mat, final float value){ + static public MatrixND fill(MatrixND mat, final double value){ mat.map(new MapFunction(){ - public float apply(float v){ + public double apply(double v){ return value; } }); return mat; } - /** - * 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é - */ - static public MatrixND matrixId(int size){ - MatrixND result = new MatrixNDImpl(new int[]{size, size}); - for(int i=0; i - * @version $Revision: 1.2 $ + * @version $Revision: 1.3 $ * - * Mise a jour: $Date: 2005/10/05 20:25:05 $ + * Mise a jour: $Date: 2005/10/20 20:58:04 $ * par : $Author: bpoussin $ */ @@ -62,11 +62,11 @@ return iterator.getCoordinates(); } - public float getValue(){ + public double getValue(){ return iterator.getValue(); } - public void setValue(float value){ + public void setValue(double value){ iterator.setValue(value); } Index: lutinmatrix/src/java/org/codelutin/math/matrix/MatrixND.java diff -u lutinmatrix/src/java/org/codelutin/math/matrix/MatrixND.java:1.4 lutinmatrix/src/java/org/codelutin/math/matrix/MatrixND.java:1.5 --- lutinmatrix/src/java/org/codelutin/math/matrix/MatrixND.java:1.4 Wed Oct 5 20:25:05 2005 +++ lutinmatrix/src/java/org/codelutin/math/matrix/MatrixND.java Thu Oct 20 20:58:04 2005 @@ -23,9 +23,9 @@ * Created: 29 oct. 2004 * * @author Benjamin Poussin -* @version $Revision: 1.4 $ +* @version $Revision: 1.5 $ * -* Mise a jour: $Date: 2005/10/05 20:25:05 $ +* Mise a jour: $Date: 2005/10/20 20:58:04 $ * par : $Author: bpoussin $ */ @@ -36,6 +36,11 @@ public interface MatrixND { // MatrixND /** + * Retourne la factory qui a permit de creer la matrice + */ + public MatrixFactory getFactory(); + + /** * Donne toutes les semantiques de la matrice * Si la matrice n'a pas de semantique retourne null */ @@ -93,7 +98,7 @@ * @param tab le tableau de valeur * @return la valeur la plus nombreuse dans le tableau */ - public float getMaxOccurence(); + public double getMaxOccurence(); /** * Retourne le nombre de dimensions de la matrice. @@ -118,7 +123,7 @@ /** * Applique une fonction sur chaque valeur de la matrice */ - public void map(MapFunction f); + public MatrixND map(MapFunction f); // /** // * Retourne la sous matrice demandée en fonction des dimensions @@ -152,19 +157,19 @@ * tableau doit contenir toutes les dimensions de la matrice, et * seulement des nombres positif * - * @return un entier float. + * @return un entier double. */ - public float getValue(int [] dim); - public float getValue(int x); - public float getValue(int x, int y); - public float getValue(int x, int y, int z); - public float getValue(int x, int y, int z, int t); - - public float getValue(Object [] coordinates); - public float getValue(Object x); - public float getValue(Object x, Object y); - public float getValue(Object x, Object y, Object z); - public float getValue(Object x, Object y, Object z, Object t); + public double getValue(int [] dim); + public double getValue(int x); + public double getValue(int x, int y); + public double getValue(int x, int y, int z); + public double getValue(int x, int y, int z, int t); + + public double getValue(Object [] coordinates); + public double getValue(Object x); + public double getValue(Object x, Object y); + public double getValue(Object x, Object y, Object z); + public double getValue(Object x, Object y, Object z, Object t); // /** // * Modifie la sous matrice demandée en fonction des dimensions @@ -198,20 +203,20 @@ * * @param dimensions les différentes dimension à extraire. * - * @param d l'entier float qui doit remplacer l'entier float spécifié + * @param d l'entier double qui doit remplacer l'entier double spécifié * par l'argument dimensions */ - public void setValue(int [] dimensions, float d); - public void setValue(int x, float d); - public void setValue(int x, int y, float d); - public void setValue(int x, int y, int z, float d); - public void setValue(int x, int y, int z, int t, float d); - - public void setValue(Object [] coordinates, float d); - public void setValue(Object x, float d); - public void setValue(Object x, Object y, float d); - public void setValue(Object x, Object y, Object z, float d); - public void setValue(Object x, Object y, Object z, Object t, float d); + public void setValue(int [] dimensions, double d); + public void setValue(int x, double d); + public void setValue(int x, int y, double d); + public void setValue(int x, int y, int z, double d); + public void setValue(int x, int y, int z, int t, double d); + + public void setValue(Object [] coordinates, double d); + public void setValue(Object x, double d); + public void setValue(Object x, Object y, double d); + public void setValue(Object x, Object y, Object z, double d); + public void setValue(Object x, Object y, Object z, Object t, double d); // /** // * Copy la matrice pour pouvoir la modifier sans perdre les @@ -464,11 +469,11 @@ /** * Multiplication d'une matrice par un scalaire */ - public MatrixND mults(final float d); + public MatrixND mults(final double d); /** * Multiplication d'une matrice par un scalaire */ - public MatrixND divs(final float d); + public MatrixND divs(final double d); // /** // * Multiplication d'une vecteur [i] avec une matrice [i,j], // * le resultat est result[i,j]=matrice[i,j]*vecteur[i] Index: lutinmatrix/src/java/org/codelutin/math/matrix/MatrixNDImpl.java diff -u lutinmatrix/src/java/org/codelutin/math/matrix/MatrixNDImpl.java:1.4 lutinmatrix/src/java/org/codelutin/math/matrix/MatrixNDImpl.java:1.5 --- lutinmatrix/src/java/org/codelutin/math/matrix/MatrixNDImpl.java:1.4 Wed Oct 5 20:25:05 2005 +++ lutinmatrix/src/java/org/codelutin/math/matrix/MatrixNDImpl.java Thu Oct 20 20:58:04 2005 @@ -23,69 +23,62 @@ * Created: 29 oct. 2004 * * @author Benjamin Poussin -* @version $Revision: 1.4 $ +* @version $Revision: 1.5 $ * -* Mise a jour: $Date: 2005/10/05 20:25:05 $ +* Mise a jour: $Date: 2005/10/20 20:58:04 $ * par : $Author: bpoussin $ */ package org.codelutin.math.matrix; +import java.util.Arrays; import java.util.List; public class MatrixNDImpl extends AbstractMatrixND { // MatrixNDImpl protected BasicMatrix matrix = null; - public MatrixNDImpl(int [] dim){ - super(dim); - matrix = new BasicMatrix(dim); + protected MatrixNDImpl(MatrixFactory factory, int [] dim){ + super(factory, dim); + matrix = new BasicMatrix(factory, dim); } - public MatrixNDImpl(List[] semantics){ - super(semantics); - matrix = new BasicMatrix(dim); + protected MatrixNDImpl(MatrixFactory factory, List[] semantics){ + super(factory, semantics); + matrix = new BasicMatrix(factory, dim); } - public MatrixNDImpl(String name, int [] dim){ - super(name, dim); - matrix = new BasicMatrix(dim); + protected MatrixNDImpl(MatrixFactory factory, String name, int [] dim){ + super(factory, name, dim); + matrix = new BasicMatrix(factory, dim); } - public MatrixNDImpl(String name, List[] semantics){ - super(name, semantics); - matrix = new BasicMatrix(dim); + protected MatrixNDImpl(MatrixFactory factory, String name, List[] semantics){ + super(factory, name, semantics); + matrix = new BasicMatrix(factory, dim); } - public MatrixNDImpl(String name, List[] semantics, String [] dimNames){ - super(name, semantics, dimNames); - matrix = new BasicMatrix(dim); + protected MatrixNDImpl(MatrixFactory factory, String name, List[] semantics, String [] dimNames){ + super(factory, name, semantics, dimNames); + matrix = new BasicMatrix(factory, dim); } - public MatrixNDImpl(MatrixND matrix){ - super(matrix.getName(), matrix.getSemantics(), matrix.getDimensionName()); - this.matrix = new BasicMatrix(dim); - for(MatrixIterator i=matrix.iterator(); i.next();){ - setValue(i.getCoordinates(), i.getValue()); - } + protected MatrixNDImpl(MatrixFactory factory, MatrixND matrix){ + super(factory, matrix.getName(), matrix.getSemantics(), matrix.getDimensionName()); + this.matrix = new BasicMatrix(factory, dim); + this.paste(matrix); } public MatrixIterator iterator(){ return new MatrixIteratorImpl(matrix.iterator(), getSemantics()); } - public float getValue(int [] coordinates){ + public double getValue(int [] coordinates){ return matrix.getValue(coordinates); } - public void setValue(int [] coordinates, float d){ - matrix.setValue(coordinates, d); - } - - // Hack pour ne pas a avoir a caster les double en float pour que l'appel - // se passe bien (surtout util au travers de langage de script public void setValue(int [] coordinates, double d){ - setValue(coordinates, (float)d); + matrix.setValue(coordinates, d); } - public float getMaxOccurence(){ + public double getMaxOccurence(){ return matrix.getMaxOccurence(); } @@ -93,5 +86,64 @@ return getName() + " " + matrix.toString(); } + // Un peu d'optimisation pour les matrices entieres (pas de sub matrix) + /** + * Si le vector utilise par la BasicMatix supporte la method map, + * on l'utilise pour gagner du temps + */ + public MatrixND map(MapFunction f){ + if (matrix.data.isImplementedMap()) { + matrix.data.map(f); + } else { + super.map(f); + } + return this; + } + + /** + * Si on peut on utilise le paste du vector de BasicMatix, sinon + * on utilise la methode de AbstractMatrixND. + */ + public MatrixND paste(int [] origin, MatrixND mat){ + // permet de savoir si l'origin est bien le point 0 de la matrice + boolean origin0 = true; + for (int i=0; i - * @version $Revision: 1.2 $ + * @version $Revision: 1.3 $ * - * Mise a jour: $Date: 2005/10/05 20:25:05 $ + * Mise a jour: $Date: 2005/10/20 20:58:04 $ * par : $Author: bpoussin $ */ @@ -53,7 +53,7 @@ public Element encodeVersion(XMLEncoderDecoder ed, Object o){ MatrixND matrix = (MatrixND)o; - float defaultValue = matrix.getMaxOccurence(); + double defaultValue = matrix.getMaxOccurence(); Element result = DocumentHelper.createElement("matrix"); result.addAttribute("defaultValue", ""+defaultValue); @@ -97,7 +97,7 @@ // ecriture des valeur de la matrice for(MatrixIterator i=matrix.iterator(); i.next();){ - float val = i.getValue(); + double val = i.getValue(); if(val != defaultValue){ String path = MatrixHelper.coordinatesToString(i.getCoordinates()); result.addElement("element").addAttribute("path", path).addAttribute("value", ""+val); @@ -117,11 +117,11 @@ int [] dims = ArrayUtil.asIntArray(dimensions); // creation du resultat - MatrixND result = new MatrixNDImpl(dims); + MatrixND result = MatrixFactory.getInstance().create(dims); // recuperation de la valeur par defaut de la matrice String defaultValueString = root.attributeValue("defaultElem", "0"); - float defaultValue = Float.parseFloat(defaultValueString); + double defaultValue = Double.parseDouble(defaultValueString); MatrixHelper.fill(result, defaultValue); //on remet toutes les valeurs dans la matrice @@ -132,7 +132,7 @@ int [] dim = ArrayUtil.asIntArray(path); String v = elem.attributeValue("function"); - result.setValue(dim, Float.parseFloat(v)); + result.setValue(dim, Double.parseDouble(v)); } return result; @@ -149,11 +149,11 @@ int [] dims = ArrayUtil.asIntArray(dimensions); // creation du resultat - MatrixND result = new MatrixNDImpl(dims); + MatrixND result = MatrixFactory.getInstance().create(dims); // recuperation de la valeur par defaut de la matrice String defaultValueString = root.attributeValue("defaultValue", "0"); - float defaultValue = Float.parseFloat(defaultValueString); + double defaultValue = Double.parseDouble(defaultValueString); MatrixHelper.fill(result, defaultValue); // on change le nom @@ -199,7 +199,7 @@ int [] dim = ArrayUtil.asIntArray(path); String v = elem.attributeValue("value"); - result.setValue(dim, Float.parseFloat(v)); + result.setValue(dim, Double.parseDouble(v)); } return result; Index: lutinmatrix/src/java/org/codelutin/math/matrix/SubMatrix.java diff -u lutinmatrix/src/java/org/codelutin/math/matrix/SubMatrix.java:1.4 lutinmatrix/src/java/org/codelutin/math/matrix/SubMatrix.java:1.5 --- lutinmatrix/src/java/org/codelutin/math/matrix/SubMatrix.java:1.4 Wed Oct 5 20:25:05 2005 +++ lutinmatrix/src/java/org/codelutin/math/matrix/SubMatrix.java Thu Oct 20 20:58:04 2005 @@ -23,9 +23,9 @@ * Created: 29 oct. 2004 * * @author Benjamin Poussin - * @version $Revision: 1.4 $ + * @version $Revision: 1.5 $ * - * Mise a jour: $Date: 2005/10/05 20:25:05 $ + * Mise a jour: $Date: 2005/10/20 20:58:04 $ * par : $Author: bpoussin $ */ @@ -47,7 +47,7 @@ protected DimensionConverter converter = null; public SubMatrix(MatrixND matrix, int dim, int start, int nb){ - super(matrix.getName(), matrix.getSemantics(), matrix.getDimensionName()); + super(matrix.getFactory(), matrix.getName(), matrix.getSemantics(), matrix.getDimensionName()); this.matrix = matrix; converter = new ShiftConverter(dim, start, nb); @@ -56,7 +56,7 @@ } public SubMatrix(MatrixND matrix, int dim, int [] elem){ - super(matrix.getName(), matrix.getSemantics(), matrix.getDimensionName()); + super(matrix.getFactory(), matrix.getName(), matrix.getSemantics(), matrix.getDimensionName()); this.matrix = matrix; converter = new MappingConverter(dim, elem); @@ -74,11 +74,11 @@ return new SubMatrixIteratorImpl(this); } - public float getValue(int [] coordinates){ + public double getValue(int [] coordinates){ return matrix.getValue(converter.convertCoordinates(coordinates)); } - public void setValue(int [] coordinates, float d){ + public void setValue(int [] coordinates, double d){ matrix.setValue(converter.convertCoordinates(coordinates), d); } @@ -125,11 +125,11 @@ return result; } - public float getValue(){ + public double getValue(){ return subMatrix.getValue(getCoordinates()); } - public void setValue(float value){ + public void setValue(double value){ subMatrix.setValue(getCoordinates(), value); }