Skip to content

Commit 549ce35

Browse files
committed
Support Matrix coefficients in clenshaw
1 parent 1c938bc commit 549ce35

File tree

1 file changed

+33
-0
lines changed

1 file changed

+33
-0
lines changed

src/clenshaw.jl

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,13 @@ overwriting `x` with the results.
5353
clenshaw!(c::AbstractVector, A::AbstractVector, B::AbstractVector, C::AbstractVector, x::AbstractVector) =
5454
clenshaw!(c, A, B, C, x, Ones{eltype(x)}(length(x)), x)
5555

56+
clenshaw!(c::AbstractMatrix, A::AbstractVector, B::AbstractVector, C::AbstractVector, x::Number, f::AbstractVector) =
57+
clenshaw!(c, A, B, C, x, one(eltype(x)), f)
58+
59+
60+
clenshaw!(c::AbstractMatrix, A::AbstractVector, B::AbstractVector, C::AbstractVector, x::AbstractVector, f::AbstractMatrix) =
61+
clenshaw!(c, A, B, C, x, Ones{eltype(x)}(length(x)), f)
62+
5663

5764
"""
5865
clenshaw!(c, A, B, C, x, ϕ₀, f)
@@ -67,6 +74,22 @@ function clenshaw!(c::AbstractVector, A::AbstractVector, B::AbstractVector, C::A
6774
end
6875

6976

77+
function clenshaw!(c::AbstractMatrix, A::AbstractVector, B::AbstractVector, C::AbstractVector, x::Number, ϕ₀::Number, f::AbstractVector)
78+
size(c,2) == length(f) || throw(DimensionMismatch("coeffients size and output length must match"))
79+
for j in axes(c,2)
80+
f[j] = ϕ₀ * clenshaw(view(c,:,j), A, B, C, x)
81+
end
82+
f
83+
end
84+
85+
function clenshaw!(c::AbstractMatrix, A::AbstractVector, B::AbstractVector, C::AbstractVector, x::AbstractVector, ϕ₀::AbstractVector, f::AbstractMatrix)
86+
(size(x,1),size(c,2)) == size(f) || throw(DimensionMismatch("coeffients size and output length must match"))
87+
for j in axes(c,2)
88+
clenshaw!(view(c,:,j), A, B, C, x, ϕ₀, view(f,:,j))
89+
end
90+
f
91+
end
92+
7093
Base.@propagate_inbounds _clenshaw_next(n, A, B, C, x, c, bn1, bn2) = muladd(muladd(A[n],x,B[n]), bn1, muladd(-C[n+1],bn2,c[n]))
7194
Base.@propagate_inbounds _clenshaw_next(n, A, ::Zeros, C, x, c, bn1, bn2) = muladd(A[n]*x, bn1, muladd(-C[n+1],bn2,c[n]))
7295
# Chebyshev U
@@ -106,6 +129,16 @@ end
106129
clenshaw(c::AbstractVector, A::AbstractVector, B::AbstractVector, C::AbstractVector, x::AbstractVector) =
107130
clenshaw!(c, A, B, C, copy(x))
108131

132+
function clenshaw(c::AbstractMatrix, A::AbstractVector, B::AbstractVector, C::AbstractVector, x::Number)
133+
T = promote_type(eltype(c),eltype(A),eltype(B),eltype(C),typeof(x))
134+
clenshaw!(c, A, B, C, x, Vector{T}(undef, size(c,2)))
135+
end
136+
137+
function clenshaw(c::AbstractMatrix, A::AbstractVector, B::AbstractVector, C::AbstractVector, x::AbstractVector)
138+
T = promote_type(eltype(c),eltype(A),eltype(B),eltype(C),typeof(x))
139+
clenshaw!(c, A, B, C, x, Matrix{T}(undef, size(x,1), size(c,2)))
140+
end
141+
109142
###
110143
# Chebyshev T special cases
111144
###

0 commit comments

Comments
 (0)