Statistics
| Revision:

root / org.gvsig.toolbox / trunk / org.gvsig.toolbox / org.gvsig.toolbox.algorithm / src / main / java / es / unex / sextante / statisticalMethods / covarianceMatrix / CovarianceMatrixAlgorithm.java @ 59

History | View | Annotate | Download (4.26 KB)

1
package es.unex.sextante.statisticalMethods.covarianceMatrix;
2

    
3
import java.util.ArrayList;
4

    
5
import es.unex.sextante.additionalInfo.AdditionalInfoMultipleInput;
6
import es.unex.sextante.core.GeoAlgorithm;
7
import es.unex.sextante.core.Sextante;
8
import es.unex.sextante.dataObjects.IRasterLayer;
9
import es.unex.sextante.dataObjects.ITable;
10
import es.unex.sextante.exceptions.GeoAlgorithmExecutionException;
11
import es.unex.sextante.exceptions.RepeatedParameterNameException;
12

    
13
public class CovarianceMatrixAlgorithm
14
         extends
15
            GeoAlgorithm {
16

    
17
   public static final String COVARIANCES = "COVARIANCES";
18
   public static final String INPUT       = "INPUT";
19

    
20
   private static double      NODATA      = -9999999.;
21

    
22
   private ArrayList          m_RasterLayers;
23
   private IRasterLayer[]     m_Windows;
24
   private int                m_iNX, m_iNY;
25
   private double             m_dMean[];
26

    
27

    
28
   @Override
29
   public void defineCharacteristics() {
30

    
31
      setUserCanDefineAnalysisExtent(true);
32
      setGroup(Sextante.getText("Statistical_methods"));
33
      setName(Sextante.getText("Covariance_matrix"));
34

    
35
      try {
36
         m_Parameters.addMultipleInput(INPUT, Sextante.getText("Input_layers"), AdditionalInfoMultipleInput.DATA_TYPE_RASTER,
37
                  true);
38
         addOutputTable(COVARIANCES, Sextante.getText("Covariance_matrix"));
39
      }
40
      catch (final RepeatedParameterNameException e) {
41
         Sextante.addErrorToLog(e);
42
      }
43

    
44
   }
45

    
46

    
47
   @Override
48
   public boolean processAlgorithm() throws GeoAlgorithmExecutionException {
49

    
50
      int i, j;
51

    
52
      m_RasterLayers = m_Parameters.getParameterValueAsArrayList(INPUT);
53

    
54
      if (m_RasterLayers.size() == 0) {
55
         return false;
56
      }
57

    
58
      final Object[] values = new Object[m_RasterLayers.size()];
59
      final String sFields[] = new String[m_RasterLayers.size()];
60
      final Class iTypes[] = new Class[m_RasterLayers.size()];
61
      final String sTableName = "Matriz de covarianzas";
62
      final double dCovar[][] = new double[m_RasterLayers.size()][m_RasterLayers.size()];
63
      m_dMean = new double[m_RasterLayers.size()];
64
      this.adjustOutputExtent();
65

    
66
      m_Windows = new IRasterLayer[m_RasterLayers.size()];
67

    
68
      for (i = 0; i < m_RasterLayers.size(); i++) {
69
         m_Windows[i] = (IRasterLayer) m_RasterLayers.get(i);
70
         m_Windows[i].setWindowExtent(this.getAnalysisExtent());
71
         m_Windows[i].setInterpolationMethod(IRasterLayer.INTERPOLATION_BSpline);
72
         sFields[i] = m_Windows[i].getName();
73
         iTypes[i] = Double.class;
74
         m_dMean[i] = m_Windows[i].getMeanValue();
75
      }
76

    
77
      final ITable table = getNewTable(COVARIANCES, sTableName, iTypes, sFields);
78

    
79
      m_iNX = getAnalysisExtent().getNX();
80
      m_iNY = getAnalysisExtent().getNY();
81

    
82
      final int iTotal = (int) (m_RasterLayers.size() * m_RasterLayers.size() / 2.);
83
      int iCount = 0;
84
      for (i = 0; (i < m_RasterLayers.size() - 1) && setProgress(iCount, iTotal); i++) {
85
         dCovar[i][i] = 1.0;
86
         iCount++;
87
         for (j = i + 1; j < m_RasterLayers.size(); j++) {
88
            dCovar[i][j] = dCovar[j][i] = getCovar(i, j);
89
            iCount++;
90
         }
91
      }
92

    
93
      for (i = 0; i < m_RasterLayers.size(); i++) {
94
         for (j = 0; j < m_RasterLayers.size(); j++) {
95
            values[j] = new Double(dCovar[i][j]);
96
         }
97
         table.addRecord(values);
98
      }
99

    
100
      return !m_Task.isCanceled();
101

    
102
   }
103

    
104

    
105
   private double getCovar(final int i,
106
                           final int j) {
107

    
108
      int x, y;
109
      int iValues = 0;
110
      double dValuei, dValuej;
111
      double dSum = 0;
112

    
113
      for (y = 0; (y < m_iNY) && setProgress(y, m_iNY); y++) {
114
         for (x = 0; x < m_iNX; x++) {
115
            dValuei = m_Windows[i].getCellValueAsDouble(x, y);
116
            dValuej = m_Windows[j].getCellValueAsDouble(x, y);
117
            if (!m_Windows[i].isNoDataValue(dValuei) && !m_Windows[j].isNoDataValue(dValuej)) {
118
               dSum += (dValuei - m_dMean[i]) * (dValuej - m_dMean[j]);
119
               iValues++;
120
            }
121
         }
122
         if (iValues > 1) {
123
            return dSum / (iValues - 1);
124
         }
125
         else {
126
            return NODATA;
127
         }
128
      }
129

    
130
      return NODATA;
131

    
132
   }
133
}