[vtkusers] vtkPCAStatistics for vectors

gregthom gregthom99 at yahoo.com
Tue Jul 14 10:26:09 EDT 2009


Hello VTK users

I was wondering if vtkPCAStatistics can be used for vectors instead of
scalars as in the example at:

TestPCAStatistics.cxx.

When looking at this example I see that scalar datas are added to a table
before adding to the pca filter, ie

const char m0Name[] = "M0";
  vtkDoubleArray* dataset1Arr = vtkDoubleArray::New();
  dataset1Arr->SetNumberOfComponents( 1 );
  dataset1Arr->SetName( m0Name );

  const char m1Name[] = "M1";
  vtkDoubleArray* dataset2Arr = vtkDoubleArray::New();
  dataset2Arr->SetNumberOfComponents( 1 );
  dataset2Arr->SetName( m1Name );

  const char m2Name[] = "M2";
  vtkDoubleArray* dataset3Arr = vtkDoubleArray::New();
  dataset3Arr->SetNumberOfComponents( 1 );
  dataset3Arr->SetName( m2Name );

  for ( int i = 0; i < nVals; ++ i )
    {
    int ti = i << 1;
    dataset1Arr->InsertNextValue( mingledData[ti] );
    dataset2Arr->InsertNextValue( mingledData[ti + 1] );
    dataset3Arr->InsertNextValue( i != 12 ? -1. : -1.001 );
    }

  vtkTable* datasetTable = vtkTable::New();
  datasetTable->AddColumn( dataset1Arr );
  dataset1Arr->Delete();
  datasetTable->AddColumn( dataset2Arr );
  dataset2Arr->Delete();
  datasetTable->AddColumn( dataset3Arr );
  dataset3Arr->Delete();

  vtkPCAStatistics* pcas = vtkPCAStatistics::New();
  pcas->SetInput( vtkStatisticsAlgorithm::INPUT_DATA, datasetTable );
  pcas->SetNormalizationSchemeByName( normScheme );
  pcas->SetBasisSchemeByName( "FixedBasisEnergy" );
  pcas->SetFixedBasisEnergy( 1. - 1e-8 );


In my case, I have 10 polydata sets and I want to do PCA on these polydata
with the end result of producing other polydatas by taking linea
combinations of the eigen vectors from PCA analysis.

Here is my approach, 


1) use one polydata as reference (P0)
2) get differences between the points of P0 and each of the other 9
polydatas
    these vectors are stored as 
    vtkDoubleArray* vectorsP0toP1array = vtkDoubleArray::New();
    vectorsP0toP1array->SetNumberOfComponents( 3 );
    vectorsP0toP1array->SetName( "vectorsP0toP1" );

    (...)

   vtkDoubleArray* vectorsP0toP9array = vtkDoubleArray::New();
    vectorsP0toP9array->SetNumberOfComponents( 3 );
    vectorsP0toP9array->SetName( "vectorsP0toP9" );

3) run PCA on the vectors

4) obtain a new vector by taking combinations of the PCA eigen vectors
    Add new vector to P0 polydata points to obtain a new polydata model

Does anyone with experience think this will work ? Could you also please
help with pseudocode for 3) and 4) ? That is where I am stuck right now.
Will adding the vectors columns in a table as in the example work ? 

ie 
  vtkTable* datasetTable = vtkTable::New();
  datasetTable->AddColumn( vectorsP0toP1array );
  ...
  datasetTable->AddColumn( vectorsP0toP9array );

then 
  vtkPCAStatistics* pcas = vtkPCAStatistics::New();
  pcas->SetInput( vtkStatisticsAlgorithm::INPUT_DATA, datasetTable );  ????



Thanks for your help in advance

 
 






   


-- 
View this message in context: http://www.nabble.com/vtkPCAStatistics-for-vectors-tp24480622p24480622.html
Sent from the VTK - Users mailing list archive at Nabble.com.




More information about the vtkusers mailing list