|
14 | 14 |
|
15 | 15 | struct ZerosAlgorithm <: AbstractAlgorithm end |
16 | 16 |
|
17 | | -for f in [:eig, :eigh, :lq, :qr, :svd] |
| 17 | +for f in [:eig, :eigh, :lq, :polar, :qr, :svd] |
18 | 18 | ff = Symbol("default_", f, "_algorithm") |
19 | 19 | @eval begin |
20 | 20 | function MatrixAlgebraKit.$ff(::Type{<:AbstractZerosMatrix}; kwargs...) |
@@ -170,6 +170,30 @@ function MatrixAlgebraKit.svd_vals!(A::AbstractZerosMatrix, F, alg::ZerosAlgorit |
170 | 170 | return diagview(A) |
171 | 171 | end |
172 | 172 |
|
| 173 | +function MatrixAlgebraKit.check_input(::typeof(left_polar!), A::AbstractZerosMatrix, F) |
| 174 | + m, n = size(A) |
| 175 | + m >= n || |
| 176 | + throw(ArgumentError("input matrix needs at least as many rows as columns")) |
| 177 | + return nothing |
| 178 | +end |
| 179 | +function MatrixAlgebraKit.left_polar!(A::AbstractZerosMatrix, F, alg::ZerosAlgorithm) |
| 180 | + check_input(left_polar!, A, F) |
| 181 | + U, S, Vᴴ = svd_compact(A) |
| 182 | + return (Eye((axes(U, 1), axes(Vᴴ, 2))), Vᴴ' * S * Vᴴ) |
| 183 | +end |
| 184 | +
|
| 185 | +function MatrixAlgebraKit.check_input(::typeof(right_polar!), A::AbstractZerosMatrix, F) |
| 186 | + m, n = size(A) |
| 187 | + n >= m || |
| 188 | + throw(ArgumentError("input matrix needs at least as many columns as rows")) |
| 189 | + return nothing |
| 190 | +end |
| 191 | +function MatrixAlgebraKit.right_polar!(A::AbstractZerosMatrix, F, alg::ZerosAlgorithm) |
| 192 | + check_input(right_polar!, A, F) |
| 193 | + U, S, Vᴴ = svd_compact(A) |
| 194 | + return (U * S * U', Eye((axes(U, 1), axes(Vᴴ, 2)))) |
| 195 | +end |
| 196 | + |
173 | 197 | struct EyeAlgorithm <: AbstractAlgorithm end |
174 | 198 |
|
175 | 199 | for f in [:eig, :eigh, :lq, :qr, :polar, :svd] |
|
0 commit comments