summaryrefslogtreecommitdiff
path: root/gsl-1.9/histogram/oper.c
diff options
context:
space:
mode:
Diffstat (limited to 'gsl-1.9/histogram/oper.c')
-rw-r--r--gsl-1.9/histogram/oper.c195
1 files changed, 195 insertions, 0 deletions
diff --git a/gsl-1.9/histogram/oper.c b/gsl-1.9/histogram/oper.c
new file mode 100644
index 0000000..1d96a6d
--- /dev/null
+++ b/gsl-1.9/histogram/oper.c
@@ -0,0 +1,195 @@
+/* gsl_histogram_oper.c
+ * Copyright (C) 2000 Simone Piccardi
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+/***************************************************************
+ *
+ * File gsl_histogram_oper.c:
+ * Routine to make operation on histograms.
+ * Need GSL library and header.
+ * Contains the routines:
+ * gsl_histogram_same_binning check if two histograms have the same binning
+ * gsl_histogram_add add two histograms
+ * gsl_histogram_sub subctract two histograms
+ * gsl_histogram_mult multiply two histograms
+ * gsl_histogram_div divide two histograms
+ * gsl_histogram_scale scale histogram contents
+ *
+ * Author: S. Piccardi
+ * Jan. 2000
+ *
+ ***************************************************************/
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_histogram.h>
+
+/*
+ * gsl_histogram_same_binning:
+ * control if two histograms have the
+ * same binning
+ */
+
+int
+gsl_histogram_equal_bins_p (const gsl_histogram * h1, const gsl_histogram * h2)
+{
+ if (h1->n != h2->n)
+ {
+ return 0;
+ }
+
+ {
+ size_t i;
+ /* init ranges */
+
+ for (i = 0; i <= h1->n; i++)
+ {
+ if (h1->range[i] != h2->range[i])
+ {
+ return 0;
+ }
+ }
+ }
+
+ return 1;
+}
+
+/*
+ * gsl_histogram_add:
+ * add two histograms
+ */
+int
+gsl_histogram_add (gsl_histogram * h1, const gsl_histogram * h2)
+{
+ size_t i;
+
+ if (!gsl_histogram_equal_bins_p (h1, h2))
+ {
+ GSL_ERROR ("histograms have different binning", GSL_EINVAL);
+ }
+
+ for (i = 0; i < h1->n; i++)
+ {
+ h1->bin[i] += h2->bin[i];
+ }
+
+ return GSL_SUCCESS;
+}
+
+/*
+ * gsl_histogram_sub:
+ * subtract two histograms
+ */
+
+int
+gsl_histogram_sub (gsl_histogram * h1, const gsl_histogram * h2)
+{
+ size_t i;
+
+ if (!gsl_histogram_equal_bins_p (h1, h2))
+ {
+ GSL_ERROR ("histograms have different binning", GSL_EINVAL);
+ }
+
+ for (i = 0; i < h1->n; i++)
+ {
+ h1->bin[i] -= h2->bin[i];
+ }
+
+ return GSL_SUCCESS;
+
+}
+
+/*
+ * gsl_histogram_mult:
+ * multiply two histograms
+ */
+
+int
+gsl_histogram_mul (gsl_histogram * h1, const gsl_histogram * h2)
+{
+ size_t i;
+
+ if (!gsl_histogram_equal_bins_p (h1, h2))
+ {
+ GSL_ERROR ("histograms have different binning", GSL_EINVAL);
+ }
+
+ for (i = 0; i < h1->n; i++)
+ {
+ h1->bin[i] *= h2->bin[i];
+ }
+
+ return GSL_SUCCESS;
+}
+/*
+ * gsl_histogram_div:
+ * divide two histograms
+ */
+int
+gsl_histogram_div (gsl_histogram * h1, const gsl_histogram * h2)
+{
+ size_t i;
+
+ if (!gsl_histogram_equal_bins_p (h1, h2))
+ {
+ GSL_ERROR ("histograms have different binning", GSL_EINVAL);
+ }
+
+ for (i = 0; i < h1->n; i++)
+ {
+ h1->bin[i] /= h2->bin[i];
+ }
+
+ return GSL_SUCCESS;
+}
+
+/*
+ * gsl_histogram_scale:
+ * scale a histogram by a numeric factor
+ */
+
+int
+gsl_histogram_scale (gsl_histogram * h, double scale)
+{
+ size_t i;
+
+ for (i = 0; i < h->n; i++)
+ {
+ h->bin[i] *= scale;
+ }
+
+ return GSL_SUCCESS;
+}
+
+/*
+ * gsl_histogram_shift:
+ * shift a histogram by a numeric offset
+ */
+
+int
+gsl_histogram_shift (gsl_histogram * h, double shift)
+{
+ size_t i;
+
+ for (i = 0; i < h->n; i++)
+ {
+ h->bin[i] += shift;
+ }
+
+ return GSL_SUCCESS;
+}