1/* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ownership. 5 * The ASF licenses this file to You under the Apache License, Version 2.0 6 * (the "License"); you may not use this file except in compliance with 7 * the License. You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17package org.apache.commons.math.stat.descriptive.moment; 18 19import java.io.Serializable; 20import java.util.Arrays; 21 22import org.apache.commons.math.DimensionMismatchException; 23 24/** 25 * Returns the arithmetic mean of the available vectors. 26 * @since 1.2 27 * @version $Revision: 922714 $ $Date: 2010-03-14 02:35:14 +0100 (dim. 14 mars 2010) $ 28 */ 29public class VectorialMean implements Serializable { 30 31 /** Serializable version identifier */ 32 private static final long serialVersionUID = 8223009086481006892L; 33 34 /** Means for each component. */ 35 private final Mean[] means; 36 37 /** Constructs a VectorialMean. 38 * @param dimension vectors dimension 39 */ 40 public VectorialMean(int dimension) { 41 means = new Mean[dimension]; 42 for (int i = 0; i < dimension; ++i) { 43 means[i] = new Mean(); 44 } 45 } 46 47 /** 48 * Add a new vector to the sample. 49 * @param v vector to add 50 * @exception DimensionMismatchException if the vector does not have the right dimension 51 */ 52 public void increment(double[] v) throws DimensionMismatchException { 53 if (v.length != means.length) { 54 throw new DimensionMismatchException(v.length, means.length); 55 } 56 for (int i = 0; i < v.length; ++i) { 57 means[i].increment(v[i]); 58 } 59 } 60 61 /** 62 * Get the mean vector. 63 * @return mean vector 64 */ 65 public double[] getResult() { 66 double[] result = new double[means.length]; 67 for (int i = 0; i < result.length; ++i) { 68 result[i] = means[i].getResult(); 69 } 70 return result; 71 } 72 73 /** 74 * Get the number of vectors in the sample. 75 * @return number of vectors in the sample 76 */ 77 public long getN() { 78 return (means.length == 0) ? 0 : means[0].getN(); 79 } 80 81 /** {@inheritDoc} */ 82 @Override 83 public int hashCode() { 84 final int prime = 31; 85 int result = 1; 86 result = prime * result + Arrays.hashCode(means); 87 return result; 88 } 89 90 /** {@inheritDoc} */ 91 @Override 92 public boolean equals(Object obj) { 93 if (this == obj) 94 return true; 95 if (!(obj instanceof VectorialMean)) 96 return false; 97 VectorialMean other = (VectorialMean) obj; 98 if (!Arrays.equals(means, other.means)) 99 return false; 100 return true; 101 } 102 103} 104