001    /*
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements.  See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache License, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License.  You may obtain a copy of the License at
008     *
009     *      http://www.apache.org/licenses/LICENSE-2.0
010     *
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */
017    package org.apache.commons.math.stat.descriptive.moment;
018    
019    import java.io.Serializable;
020    import java.util.Arrays;
021    
022    import org.apache.commons.math.DimensionMismatchException;
023    
024    /**
025     * Returns the arithmetic mean of the available vectors.
026     * @since 1.2
027     * @version $Revision: 922714 $ $Date: 2010-03-13 20:35:14 -0500 (Sat, 13 Mar 2010) $
028     */
029    public class VectorialMean implements Serializable {
030    
031        /** Serializable version identifier */
032        private static final long serialVersionUID = 8223009086481006892L;
033    
034        /** Means for each component. */
035        private final Mean[] means;
036    
037        /** Constructs a VectorialMean.
038         * @param dimension vectors dimension
039         */
040        public VectorialMean(int dimension) {
041            means = new Mean[dimension];
042            for (int i = 0; i < dimension; ++i) {
043                means[i] = new Mean();
044            }
045        }
046    
047        /**
048         * Add a new vector to the sample.
049         * @param v vector to add
050         * @exception DimensionMismatchException if the vector does not have the right dimension
051         */
052        public void increment(double[] v) throws DimensionMismatchException {
053            if (v.length != means.length) {
054                throw new DimensionMismatchException(v.length, means.length);
055            }
056            for (int i = 0; i < v.length; ++i) {
057                means[i].increment(v[i]);
058            }
059        }
060    
061        /**
062         * Get the mean vector.
063         * @return mean vector
064         */
065        public double[] getResult() {
066            double[] result = new double[means.length];
067            for (int i = 0; i < result.length; ++i) {
068                result[i] = means[i].getResult();
069            }
070            return result;
071        }
072    
073        /**
074         * Get the number of vectors in the sample.
075         * @return number of vectors in the sample
076         */
077        public long getN() {
078            return (means.length == 0) ? 0 : means[0].getN();
079        }
080    
081        /** {@inheritDoc} */
082        @Override
083        public int hashCode() {
084            final int prime = 31;
085            int result = 1;
086            result = prime * result + Arrays.hashCode(means);
087            return result;
088        }
089    
090        /** {@inheritDoc} */
091        @Override
092        public boolean equals(Object obj) {
093            if (this == obj)
094                return true;
095            if (!(obj instanceof VectorialMean))
096                return false;
097            VectorialMean other = (VectorialMean) obj;
098            if (!Arrays.equals(means, other.means))
099                return false;
100            return true;
101        }
102    
103    }