# how to approximate the eigendecomposition of a correlation matrix when the data have been standardized?

## Context

I am working to develop a penalized regression framework that will scale up to analyzing high dimensional data with a certain correlation structure. Let $$X$$ represent an $$n \times p$$ matrix of data - rows are observations, columns are features. To adjust for the fact that features of $$X$$ are usually on different scales, I center and scale the columns of $$X$$ to obtain $$\dot X$$. The model I am studying requires the eigendecomposition of a correlation matrix $$K = \frac{1}{p} \dot X \dot X^\top$$, so I take $$\text{eigen}(K) = USU^\top$$ and use $$U$$ and $$S$$ in a subsequent transformation.

## Present issue

Relevant to the present problem: I want to do cross-validation (CV) in order to choose a tuning parameter for my model (e.g., a tuning parameter $$\lambda$$ for a lasso model). In order to make sure the CV implementation represents every step of the modeling process, I need to standardize the training data $$X^*$$ in every fold. However, I want to avoid constructing $$K^*$$ and taking $$\text{eigen}(K^*)$$ in each fold, as this would be prohibitively expensive (computationally speaking). What I'd like to have is a relatively cheap way to approximate $$U^*, S^*$$, the eigenvectors/eigenvalues of the correlation matrix of the standardized training data.

## Toy example

# before CV --------------------------
n <- 5
p <- 10

X <- matrix(rnorm(n*p), n, p)
std_X <- scale(X)
K <- tcrossprod(std_X)/p # correlation matrix
eigen_K <- eigen(K)
U <- eigen_K$$vectors S <- diag(eigen_K$$values)

# in CV -------------------------------
train <- sample(n, 3)  # indices of observations in training data
train_X <- std_X[train,] # subset for folds
std_train_X <- scale(train_X) # re-standardize to mirror full-model procedure

# true decomposition (what I need)
star_K <- tcrossprod(std_train_X)/ncol(train_X)
star_eigen_K <- eigen(star_K) # eigen = expensive!
star_U <- star_eigen_K$$vectors star_S <- star_eigen_K$$values

# CV subset
train_U <- U[train,]
train_K <- tcrossprod(train_X)/ncol(train_X)

# ... but train_U and S do not represent a decomposition of star_K.


Is there any way to avoid constructing & decomposing star_K in each fold? In particular, how (if at all) can star_U be approximated from the training data, the existing decomposition $$U, S$$, and the centering/scaling values used to standardize train_X into std_train_X?