samer@0: package samer.mds; samer@0: samer@0: import samer.maths.*; samer@0: import samer.tools.*; samer@0: import samer.core.types.*; samer@0: import java.util.*; samer@0: samer@0: /** Compute component-wise filter coefficients using a samer@0: a distance/proximity matrix. The filter kernel is centred on samer@0: one of the elements, so that the coefficients are a function samer@0: of the distance/proximity between each unit and the given samer@0: "pivot" element. samer@0: */ samer@0: samer@0: public class ProximityFilter extends NullTask implements Observer { samer@0: Matrix R; samer@0: VVector F; samer@0: VFunction map; // map from proximity to coeff. samer@0: VInteger i; // centre element, num elements samer@0: samer@0: public ProximityFilter(Matrix R, VVector F, VFunction map) { samer@0: this.R=R; this.F=F; this.map=map; samer@0: i=new VInteger("pivot",0); samer@0: i.setRange(0,R.getRowDimension()-1); samer@0: samer@0: R.addObserver(this); samer@0: map.addObserver(this); samer@0: i.addObserver(this); samer@0: } samer@0: public void run() { map.getFunction().apply(R.getArray()[i.value],F.array()); } samer@0: public void update(Observable obs, Object arg) { run(); F.changed(); } samer@0: public void dispose() { samer@0: map.deleteObserver(this); samer@0: R.deleteObserver(this); samer@0: i.dispose(); samer@0: } samer@0: }