/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.analytics.financial.covariance; import com.opengamma.analytics.math.function.Function; import com.opengamma.analytics.math.matrix.DoubleMatrix2D; import com.opengamma.timeseries.DoubleTimeSeries; import com.opengamma.util.ArgumentChecker; /** * * Given a covariance calculator and an array of {@link DoubleTimeSeries} calculates a covariance matrix. */ public class CovarianceMatrixCalculator implements Function<DoubleTimeSeries<?>, DoubleMatrix2D> { /** The covariance calculator */ private final CovarianceCalculator _calculator; /** * @param calculator A covariance calculator, not null */ public CovarianceMatrixCalculator(final CovarianceCalculator calculator) { ArgumentChecker.notNull(calculator, "covariance calculator"); _calculator = calculator; } /** * * Calculates a covariance matrix given an array of time series. The ordering of the elements is determined by the order of the array * @param x An array of {@link DoubleTimeSeries}, not null or empty * @return The covariance matrix */ @Override public DoubleMatrix2D evaluate(final DoubleTimeSeries<?>... x) { ArgumentChecker.notEmpty(x, "x"); final int n = x.length; final double[][] covariance = new double[n][n]; DoubleTimeSeries<?> ts; for (int i = 0; i < n; i++) { ts = x[i]; covariance[i][i] = _calculator.evaluate(ts, ts); for (int j = 0; j < i; j++) { covariance[i][j] = _calculator.evaluate(ts, x[j]); covariance[j][i] = covariance[i][j]; } } return new DoubleMatrix2D(covariance); } }