-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPCA_INTERNAL.lambda
More file actions
26 lines (26 loc) · 1.39 KB
/
PCA_INTERNAL.lambda
File metadata and controls
26 lines (26 loc) · 1.39 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
=LAMBDA( system, tolerance, LET
( nCols, COLUMNS(system)
, covMatrix, INDEX(system, SEQUENCE(nCols), SEQUENCE(1, nCols))
, accJacobi, INDEX(system, SEQUENCE(nCols, 1, nCols + 1), SEQUENCE(1, nCols))
, covLower, MAKEARRAY(nCols, nCols, LAMBDA(iRow, iCol, IF(iCol > iRow - 1, 0, INDEX(covMatrix, iRow, iCol))))
, covAbs, ABS(covLower)
, worst, MAX(covAbs)
, IF( worst < tolerance, system, LET
( worstInRow, BYROW(covAbs, LAMBDA(x, MAX(x)))
, wRow, MATCH(worst, worstInRow, 0)
, worstInCol, BYCOL(covAbs, LAMBDA(x, MAX(x)))
, wCol, MATCH(worst, worstInCol, 0)
, tau, (INDEX(covMatrix, wRow, wRow) - INDEX(covMatrix, wCol, wCol)) / (2 * INDEX(covMatrix, wRow, wCol))
, t_, IF(tau < 0, -tau - SQRT(1 + tau*tau), -tau + SQRT(1 + tau*tau))
, cval, 1 / SQRT(1 + t_ * t_)
, sval, cval * t_
, jacobi, MAKEARRAY( nCols, nCols, LAMBDA(jRow, jCol,
IF(AND(jRow = wCol, jCol = wCol), cval,
IF(AND(jRow = wRow, jCol = wRow), cval,
IF(AND(jRow = wCol, jCol = wRow), sval,
IF(AND(jRow = wRow, jCol = wCol), -sval,
IF(AND(jRow = jCol), 1, 0)))))))
, newCovMatrix, MMULT(MMULT(TRANSPOSE(jacobi), covMatrix), jacobi)
, newAccJacobi, MMULT(TRANSPOSE(jacobi), accJacobi)
, PCA_INTERNAL(VSTACK(newCovMatrix, newAccJacobi), tolerance)
))))