Fix SVD pipeline bugs; extract and unit-test bidiagonal block solvers

- Snapshot bidiagonal block before solving (W overwrite corrupted Ublock)
- Wide-matrix QL row extent fix (rowsQL = n when transposed)
- Vt output copy bound j<columns (was OOB write clobbering caller sigma)
- Rank-deficient blocks: residual singular values sigma_i = ||B*v_i||
  instead of sqrt(eigs of B*B) (condition-number squaring); Gram-Schmidt
  orthonormalization of U columns with rank-deficiency completion
- JacobiEigenSymmetric: return signed eigenvalues (removed fabsf)
- Fix 28 WithinRel(0.0f,.) matcher misuse -> WithinAbs in matrix-tests
- New unit tests: SolveBidiagonalBlock2x2 (7 scipy-referenced cases),
  JacobiEigenSymmetric (3 cases), DeflateBidiagonal/BidiagonalIsDiagonal
This commit is contained in:
2026-08-19 14:05:44 -04:00
parent f12625b41e
commit ac4bef88fc
4 changed files with 381 additions and 26 deletions
+2 -1
View File
@@ -826,7 +826,8 @@ TEST_CASE("SVD: Rank-Deficient 3x3 Matrix", "Matrix") {
TEST_CASE("SVD: Diagonal 3x3 Matrix", "Matrix") {
// For a diagonal matrix, σ = diagonal entries, U = V = I
Matrix<3, 3> A{10.0f, 0.0f, 0.0f, 5.0f, 0.0f, 0.0f, 0.0f, 0.0f, 2.0f};
// Row-major init: [10,0,0, 0,5,0, 0,0,2] = diag(10,5,2)
Matrix<3, 3> A{10.0f, 0.0f, 0.0f, 0.0f, 5.0f, 0.0f, 0.0f, 0.0f, 2.0f};
Matrix<3, 3> U{}, Vt{};
Matrix<3, 1> sigma{};