def decompose(self, features): # features are of dimension NUMVOXELSxNUMFEATURES
        # sanity checks
        self.numComponents = self.checkNumComponents(features.shape[1], self.numComponents)
        
        # use singular value decomposition (SVD)
        meanData = self.meanData(features)
        features_centered = features - meanData
        
        U,s,Vh = numpy.linalg.svd(features_centered, full_matrices=False)
        ZV = (U*s).T #equivalent: numpy.dot(Vh, features.T)
        FZ = Vh
        # preselect components
        ZV = ZV[range(0, self.numComponents), :]
        FZ = FZ[:, range(0, self.numComponents)]
        return FZ, ZV
    
    # helper method
dataset/ETHPy150Open ilastik/ilastik-0.5/ilastik/modules/unsupervised_decomposition/core/algorithms/unsupervisedDecompositionPCA.py/UnsupervisedDecompositionPCA.decompose/original