void PCA<T>::InitFromPointMatrix(DenseMatrix<T> &B) { const UINT PointCount = B.ColCount(); const UINT Dimension = B.RowCount(); Console::WriteLine(String("Initializing PCA, ") + String(B.ColCount()) + String(" points, ") + String(B.RowCount()) + String(" dimensions")); _Means.Allocate(Dimension); _Means.Clear(0.0); for(UINT PointIndex = 0; PointIndex < PointCount; PointIndex++) { for(UINT DimensionIndex = 0; DimensionIndex < Dimension; DimensionIndex++) { _Means[DimensionIndex] += B.Cell(DimensionIndex, PointIndex); } } for(UINT DimensionIndex = 0; DimensionIndex < Dimension; DimensionIndex++) { _Means[DimensionIndex] /= PointCount; } for(UINT PointIndex = 0; PointIndex < PointCount; PointIndex++) { for(UINT DimensionIndex = 0; DimensionIndex < Dimension; DimensionIndex++) { B.Cell(DimensionIndex, PointIndex) -= _Means[DimensionIndex]; } } DenseMatrix<T> C; Console::WriteLine("Building correlation matrix..."); DenseMatrix<T>::MultiplyMMTranspose(C, B); DenseMatrix<T>::MultiplyInPlace(C, T(1.0) / T(PointCount)); InitFromCorrelationMatrix(C); }