001 /* 002 * Copyright (C) 2008-2010 by Holger Arndt 003 * 004 * This file is part of the Universal Java Matrix Package (UJMP). 005 * See the NOTICE file distributed with this work for additional 006 * information regarding copyright ownership and licensing. 007 * 008 * UJMP is free software; you can redistribute it and/or modify 009 * it under the terms of the GNU Lesser General Public License as 010 * published by the Free Software Foundation; either version 2 011 * of the License, or (at your option) any later version. 012 * 013 * UJMP is distributed in the hope that it will be useful, 014 * but WITHOUT ANY WARRANTY; without even the implied warranty of 015 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 016 * GNU Lesser General Public License for more details. 017 * 018 * You should have received a copy of the GNU Lesser General Public 019 * License along with UJMP; if not, write to the 020 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, 021 * Boston, MA 02110-1301 USA 022 */ 023 024 package org.ujmp.core.doublematrix.calculation.general.statistical; 025 026 import org.ujmp.core.Matrix; 027 import org.ujmp.core.annotation.Annotation; 028 import org.ujmp.core.annotation.DefaultAnnotation; 029 import org.ujmp.core.doublematrix.calculation.AbstractDoubleCalculation; 030 import org.ujmp.core.exceptions.MatrixException; 031 import org.ujmp.core.util.MathUtil; 032 033 public class Sum extends AbstractDoubleCalculation { 034 private static final long serialVersionUID = 1070433312716157660L; 035 036 boolean ignoreNaN = false; 037 038 public Sum(Matrix matrix) { 039 this(ROW, true, matrix); 040 } 041 042 public Sum(int dimension, boolean ignoreNaN, Matrix matrix) { 043 super(dimension, matrix); 044 this.ignoreNaN = ignoreNaN; 045 Annotation aold = matrix.getAnnotation(); 046 if (aold != null) { 047 Annotation a = new DefaultAnnotation(getSize()); 048 a.setMatrixAnnotation(aold.getMatrixAnnotation()); 049 if (dimension == ROW) { 050 a.setDimensionMatrix(ROW, aold.getDimensionMatrix(ROW)); 051 } else if (dimension == COLUMN) { 052 a.setDimensionMatrix(COLUMN, aold.getDimensionMatrix(COLUMN)); 053 } 054 setAnnotation(a); 055 } 056 } 057 058 public double getDouble(long... coordinates) throws MatrixException { 059 double sum = 0; 060 061 if (ignoreNaN) { 062 063 switch (getDimension()) { 064 case ROW: 065 for (long r = getSource().getSize()[ROW] - 1; r != -1; r--) { 066 sum += MathUtil.ignoreNaN(getSource().getAsDouble(r, coordinates[COLUMN])); 067 } 068 return sum; 069 case COLUMN: 070 for (long c = getSource().getSize()[COLUMN] - 1; c != -1; c--) { 071 sum += MathUtil.ignoreNaN(getSource().getAsDouble(coordinates[ROW], c)); 072 } 073 return sum; 074 case ALL: 075 for (long r = getSource().getSize()[ROW] - 1; r != -1; r--) { 076 for (long c = getSource().getSize()[COLUMN] - 1; c != -1; c--) { 077 sum += MathUtil.ignoreNaN(getSource().getAsDouble(r, c)); 078 } 079 } 080 return sum; 081 default: 082 return 0.0; 083 } 084 } else { 085 switch (getDimension()) { 086 case ROW: 087 for (long r = getSource().getSize()[ROW] - 1; r != -1; r--) { 088 sum += getSource().getAsDouble(r, coordinates[COLUMN]); 089 } 090 return sum; 091 case COLUMN: 092 for (long c = getSource().getSize()[COLUMN] - 1; c != -1; c--) { 093 sum += getSource().getAsDouble(coordinates[ROW], c); 094 } 095 return sum; 096 case ALL: 097 for (long r = getSource().getSize()[ROW] - 1; r != -1; r--) { 098 for (long c = getSource().getSize()[COLUMN] - 1; c != -1; c--) { 099 sum += getSource().getAsDouble(r, c); 100 } 101 } 102 return sum; 103 default: 104 return 0.0; 105 } 106 } 107 108 } 109 110 public long[] getSize() { 111 switch (getDimension()) { 112 case ROW: 113 return new long[] { 1, getSource().getSize()[COLUMN] }; 114 case COLUMN: 115 return new long[] { getSource().getSize()[ROW], 1 }; 116 case ALL: 117 return new long[] { 1, 1 }; 118 } 119 return null; 120 } 121 122 }