package pl.piotrsukiennik.whowhen.processer.transformer; import pl.piotrsukiennik.whowhen.shared.util.math.MeanCalculator; import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * @author Piotr Sukiennik */ public class DeltaTransformer extends AbstractFeatureVectorsTransformer { private int range; @Override public List<double[]> transform( List<double[]> features ) { List<double[]> output = new ArrayList<double[]>(); double[][] window = new double[2 * range][]; int featuresLen = features.size(); for ( int i = 0; i < featuresLen; i++ ) { for ( int wi = 0, step = 1; wi < 2 * range; wi++, step++ ) { window[wi] = Arrays.copyOfRange( features.get( Math.min( Math.max( 0, i - step ), featuresLen - 1 ) ), getColumnsFrom(), getColumnsTo() ); window[++wi] = Arrays.copyOfRange( features.get( Math.min( Math.max( 0, i + step ), featuresLen - 1 ) ), getColumnsFrom(), getColumnsTo() ); } double[] featuresArray = features.get( i ); double[] delta = MeanCalculator.calculateMean( Arrays.asList( window ), MeanCalculator.MeanMethod.ARITHMETIC ); double[] featuresOutput = new double[featuresArray.length * 2]; System.arraycopy( featuresArray, 0, featuresOutput, 0, featuresArray.length ); System.arraycopy( delta, 0, featuresOutput, featuresArray.length, delta.length ); output.add( featuresOutput ); } return output; } public int getRange() { return range; } public void setRange( int range ) { this.range = range; } public static void main( String... args ) { DeltaTransformer deltaTransformer = new DeltaTransformer(); deltaTransformer.setRange( 2 ); for ( double[] doubles : deltaTransformer.transform( new ArrayList<double[]>() {{ add( new double[] { .1, .2, .3, .4 } ); add( new double[] { .1, .2, .3, .4 } ); add( new double[] { .1, .2, .3, .4 } ); add( new double[] { .1, .2, .3, .4 } ); add( new double[] { .1, .2, .3, .4 } ); add( new double[] { .1, .2, .3, .4 } ); add( new double[] { .1, .2, .3, .4 } ); add( new double[] { .1, .2, .3, .4 } ); add( new double[] { .1, .2, .3, .4 } ); }} ) ) { System.out.println( Arrays.toString( doubles ) ); } } }