Index: lutinmatrix/src/java/org/codelutin/math/matrix/AbstractMatrixND.java diff -u lutinmatrix/src/java/org/codelutin/math/matrix/AbstractMatrixND.java:1.2 lutinmatrix/src/java/org/codelutin/math/matrix/AbstractMatrixND.java:1.3 --- lutinmatrix/src/java/org/codelutin/math/matrix/AbstractMatrixND.java:1.2 Thu Nov 4 13:50:17 2004 +++ lutinmatrix/src/java/org/codelutin/math/matrix/AbstractMatrixND.java Mon Nov 8 13:49:54 2004 @@ -23,9 +23,9 @@ * Created: 29 oct. 2004 * * @author Benjamin Poussin - * @version $Revision: 1.2 $ + * @version $Revision: 1.3 $ * - * Mise a jour: $Date: 2004/11/04 13:50:17 $ + * Mise a jour: $Date: 2004/11/08 13:49:54 $ * par : $Author: bpoussin $ */ @@ -310,6 +310,18 @@ return getSubMatrix(dim, begin, nb); } + public MatrixND getSubMatrix(int dim, Object [] elem){ + int [] ielem = new int[elem.length]; + for(int i=0; i 1 ){ + for (int j=getNbDim()-1; j>=0 ; j--){ + // si la dimension à plus d'un élément ou si on a pas assez de + // dimension pour avoir le minimum demandé on prend la dimension + if (getDim(j) > 1 || j < minNbDim){ // on ne conserve que les dimensions supérieure à 1 correspondance[sem.size()] = j; sem.add(getSemantics(j)); dimName.add(getDimensionName(j)); + // on vient de prendre une dimension il nous en faut une de moins + minNbDim--; } } - if(sem.size() == 0){ - // on a pas retrouve de dimension avec plus de 1 element - // on utilise alors les infos de la premiere dimension - correspondance[0] = 0; - sem.add(getSemantics(0)); - dimName.add(getDimensionName(0)); + // on converti les listes en tableau en inversant l'ordre car on + // a fait un parcours en sens inverse + int nbDim = sem.size(); + List [] newSemantics = new List[nbDim]; + String [] newDimNames = new String[nbDim]; + int [] tmpcorrespondance = new int[nbDim]; + for(int i=0; i - * @version $Revision: 1.1.1.1 $ + * @version $Revision: 1.2 $ * - * Mise a jour: $Date: 2004/11/02 16:25:31 $ + * Mise a jour: $Date: 2004/11/08 13:49:54 $ * par : $Author: bpoussin $ */ @@ -189,8 +189,8 @@ */ protected void checkDim(int [] dim){ for(int i=0; i - * @version $Revision: 1.3 $ + * @version $Revision: 1.4 $ * - * Mise a jour: $Date: 2004/11/04 13:50:17 $ + * Mise a jour: $Date: 2004/11/08 13:49:54 $ * par : $Author: bpoussin $ */ @@ -39,9 +39,14 @@ import java.util.logging.Level; import java.util.logging.Logger; import java.util.NoSuchElementException; +import org.codelutin.xml.XMLEncoderDecoder; public class MatrixHelper { // MatrixHelper + static { + XMLEncoderDecoder.registerType(MatrixND.class, new MatrixXMLDelegator()); + } + /** * permet de donner une représentation String d'un tableau de coordonnées * @param coordinates les coordonnées @@ -222,21 +227,18 @@ } static public String encodeToXML(MatrixND mat){ - try{ - StringWriter out = new StringWriter(); - MatrixEncoder encoder = new MatrixEncoder(out); - encoder.writeMatrice(mat); - return out.toString(); - }catch(IOException eee){ - Logger.getLogger(MatrixHelper.class + ".encodeToXML").log(Level.WARNING, "Normalement cette exception ne doit pas apparaitre, car on ecrit dans une chaine de caractere", eee); - throw new MatrixException("Erreur inattendue", eee); - } + StringWriter out = new StringWriter(); + XMLEncoderDecoder.getInstance().encode(out, mat); + return out.toString(); } static public MatrixND decodeFromXML(String xml){ - MatrixDecoder decoder = new MatrixDecoder(new StringReader(xml)); - return decoder.readMatrix(); - } + try{ + return (MatrixND)XMLEncoderDecoder.getInstance().decode(new StringReader(xml)); + }catch(Exception eee){ + throw new MatrixException("Erreur durant le decodage de la matrice", eee); + } + } // // public MatriceND sommer(int dim)throws MatriceException; Index: lutinmatrix/src/java/org/codelutin/math/matrix/MatrixND.java diff -u lutinmatrix/src/java/org/codelutin/math/matrix/MatrixND.java:1.2 lutinmatrix/src/java/org/codelutin/math/matrix/MatrixND.java:1.3 --- lutinmatrix/src/java/org/codelutin/math/matrix/MatrixND.java:1.2 Thu Nov 4 13:50:17 2004 +++ lutinmatrix/src/java/org/codelutin/math/matrix/MatrixND.java Mon Nov 8 13:49:54 2004 @@ -23,9 +23,9 @@ * Created: 29 oct. 2004 * * @author Benjamin Poussin -* @version $Revision: 1.2 $ +* @version $Revision: 1.3 $ * -* Mise a jour: $Date: 2004/11/04 13:50:17 $ +* Mise a jour: $Date: 2004/11/08 13:49:54 $ * par : $Author: bpoussin $ */ @@ -374,9 +374,6 @@ * dim * @param start la position dans dim d'ou il faut partir pour prendre * la sous matrice. - * si start est négatif alors la position de départ est calculé par rapport - * à la fin de la dimension, pour avoir le dernier élément il faut passer - * -1 * @param nb le nombre d'élément à prendre dans la dimension. si nb est * inférieur ou égal à 0 alors cela indique qu'il faut prendre tous les * éléments jusqu'à la fin de la dimension. @@ -390,11 +387,35 @@ * @param dim la dimension dans lequel on veut une sous matrice * @param start la position dans dim d'ou il faut partir pour prendre * la sous matrice. 0 <= start < dim.size - * @param nb le nombre d'élément à prendre dans la dimension + * si start est négatif alors la position de départ est calculé par rapport + * à la fin de la dimension, pour avoir le dernier élément il faut passer + * -1 + * @param nb le nombre d'élément à prendre dans la dimension si nb est + * inférieur ou égal à 0 alors cela indique qu'il faut prendre tous les + * éléments jusqu'à la fin de la dimension. */ public MatrixND getSubMatrix(int dim, int start, int nb); /** + * Permet de prendre une sous matrice dans la matrice courante. La sous + * matrice a le même nombre de dimensions mais sur une des dimensions + * on ne prend que certain élément. + * @param dim la dimension dans lequel on veut une sous matrice + * @param elem les éléments dans la dimension à conserver + */ + public MatrixND getSubMatrix(int dim, Object [] elem); + + /** + * Permet de prendre une sous matrice dans la matrice courante. La sous + * matrice a le même nombre de dimensions mais sur une des dimensions + * on ne prend que certain élément. + * @param dim la dimension dans lequel on veut une sous matrice + * @param elem les éléments dans la dimension à conserver + */ + public MatrixND getSubMatrix(int dim, int [] elem); + + + /** * Addition la matrice courante avec la matrice passe en parametre et * ce retourne elle meme */ @@ -414,10 +435,21 @@ * Reduit la matrice de sorte que toutes les dimensions qui n'ont qu'un * élement soit supprimée. Au pire cette méthode retourne une matrice * à une seule dimension à un seul élément. - * @return une nouvelle matrice plus petite ou que la matrice actuelle + * @return une nouvelle matrice plus petite que la matrice actuelle * ou egal s'il n'y a aucune dimension à supprimer */ public MatrixND reduce(); + + /** + * Reduit la matrice de sorte que toutes les dimensions qui n'ont qu'un + * élement soit supprimée. Au pire cette méthode retourne une matrice + * à une seule dimension à un seul élément. + * @param minNbDim le nombre minimum de dimension que l'on souhaite pour + * la matrice résultat + * @return une nouvelle matrice plus petite que la matrice actuelle + * ou egal s'il n'y a aucune dimension à supprimer + */ + public MatrixND reduce(int minNbDim); /** * Multiplication normal de 2 matrices 2D. Retourne une nouvelle matrice Index: lutinmatrix/src/java/org/codelutin/math/matrix/MatrixNDImpl.java diff -u lutinmatrix/src/java/org/codelutin/math/matrix/MatrixNDImpl.java:1.2 lutinmatrix/src/java/org/codelutin/math/matrix/MatrixNDImpl.java:1.3 --- lutinmatrix/src/java/org/codelutin/math/matrix/MatrixNDImpl.java:1.2 Thu Nov 4 13:50:17 2004 +++ lutinmatrix/src/java/org/codelutin/math/matrix/MatrixNDImpl.java Mon Nov 8 13:49:54 2004 @@ -23,9 +23,9 @@ * Created: 29 oct. 2004 * * @author Benjamin Poussin -* @version $Revision: 1.2 $ +* @version $Revision: 1.3 $ * -* Mise a jour: $Date: 2004/11/04 13:50:17 $ +* Mise a jour: $Date: 2004/11/08 13:49:54 $ * par : $Author: bpoussin $ */ @@ -84,7 +84,7 @@ } public String toString(){ - return matrix.toString(); + return getName() + " " + matrix.toString(); } } // MatrixNDImpl Index: lutinmatrix/src/java/org/codelutin/math/matrix/SubMatrix.java diff -u lutinmatrix/src/java/org/codelutin/math/matrix/SubMatrix.java:1.2 lutinmatrix/src/java/org/codelutin/math/matrix/SubMatrix.java:1.3 --- lutinmatrix/src/java/org/codelutin/math/matrix/SubMatrix.java:1.2 Thu Nov 4 13:50:17 2004 +++ lutinmatrix/src/java/org/codelutin/math/matrix/SubMatrix.java Mon Nov 8 13:49:54 2004 @@ -23,15 +23,17 @@ * Created: 29 oct. 2004 * * @author Benjamin Poussin - * @version $Revision: 1.2 $ + * @version $Revision: 1.3 $ * - * Mise a jour: $Date: 2004/11/04 13:50:17 $ + * Mise a jour: $Date: 2004/11/08 13:49:54 $ * par : $Author: bpoussin $ */ package org.codelutin.math.matrix; import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; import java.util.NoSuchElementException; /** @@ -41,47 +43,43 @@ */ public class SubMatrix extends AbstractMatrixND { // SubMatrix - protected int dim; - protected int start; - protected int nb; protected MatrixND matrix = null; + protected DimensionConverter converter = null; public SubMatrix(MatrixND matrix, int dim, int start, int nb){ super(matrix.getName(), matrix.getSemantics(), matrix.getDimensionName()); this.matrix = matrix; - this.dim = dim; - this.start = start; - this.nb = nb; + converter = new ShiftConverter(dim, start, nb); setSemantics(dim, getSemantics(dim).subList(start, start + nb)); getDim()[dim] = nb; } + public SubMatrix(MatrixND matrix, int dim, int [] elem){ + super(matrix.getName(), matrix.getSemantics(), matrix.getDimensionName()); + this.matrix = matrix; + + converter = new MappingConverter(dim, elem); + + List oldSemantic = getSemantics(dim); + List newSemantic = new LinkedList(); + for(int i=0; i + * @version $Revision: 1.1 $ + * + * Mise a jour: $Date: 2004/11/08 13:49:54 $ + * par : $Author: bpoussin $ + */ + +package org.codelutin.math.matrix; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; +import org.dom4j.DocumentHelper; +import org.dom4j.Element; +import org.codelutin.xml.XMLEncoderDecoder; +import org.codelutin.xml.XMLEncoderDecoderDelegatorVersioned; +import org.codelutin.util.ArrayUtil; + +public class MatrixXMLDelegator extends XMLEncoderDecoderDelegatorVersioned { // MatrixXMLDelegator + + /** version d'encodage de la matrice */ + static final protected String CURRENT_VERSION = "1"; + + public String getVersion(){ + return CURRENT_VERSION; + } + + public Element encodeVersion(XMLEncoderDecoder ed, Object o){ + MatrixND matrix = (MatrixND)o; + + double defaultValue = matrix.getMaxOccurence(); + + Element result = DocumentHelper.createElement("matrix"); + result.addAttribute("defaultValue", ""+defaultValue); + result.addAttribute("name", matrix.getName()); + result.addAttribute("dimensions", MatrixHelper.coordinatesToString(matrix.getDim())); + result.addAttribute("type", matrix.getClass().getName()); + + // ecriture des noms des dimensions + for(int i=0; i 0){ + Object o = ed.decode((Element)childs.get(0)); + // on remet l'objet a la bonne place + String indexString = obj.attributeValue("index"); + int index = Integer.parseInt(indexString); + semantics.set(index, o); + } + } + result.setSemantics(dim, semantics); + } + + //on remet toutes les valeurs dans la matrice + for(Iterator i=root.elementIterator("element"); i.hasNext();){ + Element elem = (Element)i.next(); + + String [] path = elem.attributeValue("path").split(","); + int [] dim = ArrayUtil.asIntArray(path); + + String v = elem.attributeValue("value"); + result.setValue(dim, Double.parseDouble(v)); + } + + return result; + + + } + +} // MatrixXMLDelegator +