From 342ef1f1950abae89f560cb291a1db236437e5f4 Mon Sep 17 00:00:00 2001
From: Julien Michel <julien.michel@cnes.fr>
Date: Tue, 10 Nov 2015 16:03:59 +0100
Subject: [PATCH] PERF: Remove calls to Update() and replace with calls to
 UpdateOutputInformation(), which will compute the stats without processing
 the full image result in memory

---
 .../app/otbDimensionalityReduction.cxx        | 25 +++++++++++--------
 1 file changed, 14 insertions(+), 11 deletions(-)

diff --git a/Modules/Applications/AppDimensionalityReduction/app/otbDimensionalityReduction.cxx b/Modules/Applications/AppDimensionalityReduction/app/otbDimensionalityReduction.cxx
index 5b5db74cbd..5da2dcea89 100644
--- a/Modules/Applications/AppDimensionalityReduction/app/otbDimensionalityReduction.cxx
+++ b/Modules/Applications/AppDimensionalityReduction/app/otbDimensionalityReduction.cxx
@@ -104,6 +104,7 @@ private:
     SetParameterDescription("in", "The input image to apply dimensionality reduction.");
     AddParameter(ParameterType_OutputImage, "out", "Output Image");
     SetParameterDescription("out", "output image. Components are ordered by decreasing eigenvalues.");
+    MandatoryOff("out");
     AddParameter(ParameterType_Group, "rescale", "Rescale Output.");
 
     MandatoryOff("rescale");
@@ -236,6 +237,7 @@ private:
       // PCA Algorithm
       case 0:
         {
+
         otbAppLogDEBUG( << "PCA Algorithm ");
         PCAForwardFilterType::Pointer filter = PCAForwardFilterType::New();
         m_ForwardFilter = filter;
@@ -245,18 +247,20 @@ private:
 
         filter->SetInput(GetParameterFloatVectorImage("in"));
         filter->SetNumberOfPrincipalComponentsRequired(nbComp);
-        filter->SetUseNormalization(normalize);
-        m_ForwardFilter->Update();
-
+        filter->SetUseNormalization(normalize);        
+        m_ForwardFilter->GetOutput()->UpdateOutputInformation();
+        
         if (invTransform)
-          {
+          {  
           invFilter->SetInput(m_ForwardFilter->GetOutput());
           if (normalize)
             {
-            otbAppLogINFO( << "Normalization MeanValue :"<<filter->GetMeanValues()<<
-                "StdValue :" <<filter->GetStdDevValues() );
+            otbAppLogINFO( << "Normalization MeanValue:"<<filter->GetMeanValues() );
             invFilter->SetMeanValues(filter->GetMeanValues());
-            invFilter->SetStdDevValues(filter->GetStdDevValues());
+            // By default normalization by std dev is deactivated in
+            //forward filter, and GetStdDevValues() returns an empty
+            //vector, which confuses the invFilter.
+            //invFilter->SetStdDevValues(filter->GetStdDevValues());
             }
 
           invFilter->SetTransformationMatrix(filter->GetTransformationMatrix());
@@ -289,9 +293,10 @@ private:
         filter->SetNumberOfPrincipalComponentsRequired(nbComp);
         filter->SetUseNormalization(normalize);
         filter->GetNoiseImageFilter()->SetRadius(radius);
-        m_ForwardFilter->Update();
+
         if (invTransform)
           {
+          m_ForwardFilter->Update();
           otbAppLogDEBUG( << "Compute Inverse Transform");
           invFilter->SetInput(m_ForwardFilter->GetOutput());
           invFilter->SetMeanValues(filter->GetMeanValues());
@@ -314,8 +319,6 @@ private:
         MAFForwardFilterType::Pointer filter = MAFForwardFilterType::New();
         m_ForwardFilter = filter;
         filter->SetInput(GetParameterFloatVectorImage("in"));
-        m_ForwardFilter->Update();
-
         otbAppLogINFO( << "V :"<<std::endl<<filter->GetV()<<"Auto-Correlation :"<<std::endl <<filter->GetAutoCorrelation() );
 
         break;
@@ -336,10 +339,10 @@ private:
         filter->SetNumberOfPrincipalComponentsRequired(nbComp);
         filter->SetNumberOfIterations(nbIterations);
         filter->SetMu(mu);
-        m_ForwardFilter->Update();
 
         if (invTransform)
           {
+          m_ForwardFilter->Update();
           otbAppLogDEBUG( << "Compute Inverse Transform");
           invFilter->SetInput(m_ForwardFilter->GetOutput());
 
-- 
GitLab