@@ -55,16 +55,36 @@ triangular_nonzeros(::SMatrix{N}) where {N} = Int(N * (N + 1) / 2)
55
55
triangular_nonzeros (:: Type{<:SMatrix{N}} ) where {N} = Int (N * (N + 1 ) / 2 )
56
56
tail_params (:: Type{S} ) where {N,T, S<: SMatrix{N,N,T} } = (T, S, N, triangular_nonzeros (S))
57
57
58
- function SimpleSymmetric (A:: SMatrix )
59
- @assert size (A, 1 ) == size (A, 2 )
60
- N = size (A, 1 )
61
- nd = ndims (A)
62
- T = eltype (A)
63
- ci = ntuple (i -> 1 : size (A, i), nd)
64
- upper_inds = filter (I -> I. I[2 ] ≥ I. I[1 ], CartesianIndices (ci))
65
- L = triangular_nonzeros (A)
66
- upper_triang = SVector {L} (map (I -> A[I], upper_inds))
67
- SimpleSymmetric {N, T, L} (upper_triang)
58
+ # function SimpleSymmetric(A::SMatrix)
59
+ # @assert size(A, 1) == size(A, 2)
60
+ # N = size(A, 1)
61
+ # nd = ndims(A)
62
+ # T = eltype(A)
63
+ # ci = ntuple(i -> 1:size(A, i), nd)
64
+ # upper_inds = filter(I -> I.I[2] ≥ I.I[1], CartesianIndices(ci))
65
+ # L = triangular_nonzeros(A)
66
+ # upper_triang = SVector{L}(map(I -> A[I], upper_inds))
67
+ # SimpleSymmetric{N, T, L}(upper_triang)
68
+ # end
69
+
70
+ @generated function SimpleSymmetric (A:: S ) where {S <: SMatrix }
71
+ N = size (S, 1 )
72
+ L = triangular_nonzeros (S)
73
+ _check_simple_symmetric_parameters (Val (N), Val (L))
74
+ expr = Vector {Expr} (undef, L)
75
+ T = eltype (S)
76
+ i = 0
77
+ for col in 1 : N, row in 1 : N
78
+ if col ≥ row
79
+ expr[i += 1 ] = :(A[$ row, $ col])
80
+ end
81
+ end
82
+ quote
83
+ Base. @_inline_meta
84
+ @inbounds return SimpleSymmetric {$N, $T, $L} (
85
+ SVector {$L, $T} (tuple ($ (expr... ))),
86
+ )
87
+ end
68
88
end
69
89
70
90
@inline function _check_simple_symmetric_parameters (
0 commit comments