Skip to content

Commit 7f9fdac

Browse files
committed
add Clenshaw tests
1 parent 549ce35 commit 7f9fdac

File tree

2 files changed

+32
-2
lines changed

2 files changed

+32
-2
lines changed

src/clenshaw.jl

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,15 +76,15 @@ end
7676

7777
function clenshaw!(c::AbstractMatrix, A::AbstractVector, B::AbstractVector, C::AbstractVector, x::Number, ϕ₀::Number, f::AbstractVector)
7878
size(c,2) == length(f) || throw(DimensionMismatch("coeffients size and output length must match"))
79-
for j in axes(c,2)
79+
@inbounds for j in axes(c,2)
8080
f[j] = ϕ₀ * clenshaw(view(c,:,j), A, B, C, x)
8181
end
8282
f
8383
end
8484

8585
function clenshaw!(c::AbstractMatrix, A::AbstractVector, B::AbstractVector, C::AbstractVector, x::AbstractVector, ϕ₀::AbstractVector, f::AbstractMatrix)
8686
(size(x,1),size(c,2)) == size(f) || throw(DimensionMismatch("coeffients size and output length must match"))
87-
for j in axes(c,2)
87+
@inbounds for j in axes(c,2)
8888
clenshaw!(view(c,:,j), A, B, C, x, ϕ₀, view(f,:,j))
8989
end
9090
f
@@ -188,4 +188,22 @@ function clenshaw(c::AbstractVector, x::Number)
188188
end
189189
end
190190

191+
function clenshaw!(c::AbstractMatrix, x::Number, f::AbstractVector)
192+
size(c,2) == length(f) || throw(DimensionMismatch("coeffients size and output length must match"))
193+
@inbounds for j in axes(c,2)
194+
f[j] = clenshaw(view(c,:,j), x)
195+
end
196+
f
197+
end
198+
199+
function clenshaw!(c::AbstractMatrix, x::AbstractVector, f::AbstractMatrix)
200+
(size(x,1),size(c,2)) == size(f) || throw(DimensionMismatch("coeffients size and output length must match"))
201+
@inbounds for j in axes(c,2)
202+
clenshaw!(view(c,:,j), x, view(f,:,j))
203+
end
204+
f
205+
end
206+
191207
clenshaw(c::AbstractVector, x::AbstractVector) = clenshaw!(c, copy(x))
208+
clenshaw(c::AbstractMatrix, x::Number) = clenshaw!(c, x, Vector{promote_type(eltype(c),typeof(x))}(undef, size(c,2)))
209+
clenshaw(c::AbstractMatrix, x::AbstractVector) = clenshaw!(c, x, Matrix{promote_type(eltype(c),eltype(x))}(undef, size(x,1), size(c,2)))

test/clenshawtests.jl

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,12 @@ import FastTransforms: clenshaw, clenshaw!, forwardrecurrence!, forwardrecurrenc
3030
# modifies x and xv
3131
@test clenshaw!(cv2, xv) == xv == x == clenshaw([1,3], elty[1,0,0.1])
3232
end
33+
34+
@testset "matrix coefficients" begin
35+
c = [1 2; 3 4; 5 6]
36+
@test clenshaw(c,0.1) [clenshaw(c[:,1],0.1), clenshaw(c[:,2],0.1)]
37+
@test clenshaw(c,[0.1,0.2]) [clenshaw(c[:,1], 0.1) clenshaw(c[:,2], 0.1); clenshaw(c[:,1], 0.2) clenshaw(c[:,2], 0.2)]
38+
end
3339
end
3440
end
3541

@@ -46,6 +52,12 @@ import FastTransforms: clenshaw, clenshaw!, forwardrecurrence!, forwardrecurrenc
4652
c = [1,2,3]
4753
@test c'forwardrecurrence(3, A, B, C, 0.1) clenshaw([1,2,3], A, B, C, 0.1)
4854
1 + (2sin(2acos(0.1)) + 3sin(3acos(0.1)))/sqrt(1-0.1^2)
55+
56+
@testset "matrix coefficients" begin
57+
c = [1 2; 3 4; 5 6]
58+
@test clenshaw(c,A,B,C,0.1) [clenshaw(c[:,1],A,B,C,0.1), clenshaw(c[:,2],A,B,C,0.1)]
59+
@test clenshaw(c,A,B,C,[0.1,0.2]) [clenshaw(c[:,1], A,B,C,0.1) clenshaw(c[:,2], A,B,C,0.1); clenshaw(c[:,1], A,B,C,0.2) clenshaw(c[:,2], A,B,C,0.2)]
60+
end
4961
end
5062

5163
@testset "Chebyshev-as-general" begin

0 commit comments

Comments
 (0)