|
11 | 11 | # A_mul_B!! mutates x while overwriting y. The generic fallback assumes it doesn't mutate x.
|
12 | 12 | A_mul_B!!(y::AbstractVector, P::HierarchicalPlan, x::AbstractVector) = A_mul_B!(y, P, x)
|
13 | 13 | A_mul_B!!(Y::AbstractMatrix, P::HierarchicalPlan, X::AbstractMatrix) = A_mul_B!(Y, P, X)
|
14 |
| -A_mul_B_odd_cols!!(Y::AbstractMatrix, P::HierarchicalPlan, X::AbstractMatrix) = A_mul_B_odd_cols!(Y, P, X) |
15 |
| -A_mul_B_even_cols!!(Y::AbstractMatrix, P::HierarchicalPlan, X::AbstractMatrix) = A_mul_B_even_cols!(Y, P, X) |
| 14 | +A_mul_B_col_J!!(Y::AbstractMatrix, P::HierarchicalPlan, X::AbstractMatrix, J::Int) = A_mul_B_col_J!(Y, P, X, J) |
16 | 15 |
|
17 | 16 | # A_mul_B! falls back to the mutating version with a copy.
|
18 | 17 | A_mul_B!(y::AbstractVector, P::HierarchicalPlan, x::AbstractVector) = A_mul_B!!(y, P, copy(x))
|
19 | 18 | A_mul_B!(Y::AbstractMatrix, P::HierarchicalPlan, X::AbstractMatrix) = A_mul_B!!(Y, P, copy(X))
|
20 |
| -A_mul_B_odd_cols!(Y::AbstractMatrix, P::HierarchicalPlan, X::AbstractMatrix) = A_mul_B_odd_cols!!(Y, P, copy(X)) |
21 |
| -A_mul_B_even_cols!(Y::AbstractMatrix, P::HierarchicalPlan, X::AbstractMatrix) = A_mul_B_even_cols!!(Y, P, copy(X)) |
| 19 | +A_mul_B_col_J!(Y::AbstractMatrix, P::HierarchicalPlan, X::AbstractMatrix) = A_mul_B_col_J!!(Y, P, copy(X), J) |
22 | 20 |
|
23 |
| -function scale_odd_cols!(b::AbstractVector, A::AbstractMatrix) |
| 21 | +function scale_col_J!(b::AbstractVector, A::AbstractVecOrMat, J::Int) |
24 | 22 | m, n = size(A)
|
25 |
| - @inbounds for j = 1:2:n |
26 |
| - @simd for i = 1:m |
27 |
| - A[i,j] *= b[i] |
28 |
| - end |
29 |
| - end |
30 |
| - A |
31 |
| -end |
32 |
| - |
33 |
| -function scale_odd_cols!(b::Number, A::AbstractMatrix) |
34 |
| - m, n = size(A) |
35 |
| - @inbounds for j = 1:2:n |
36 |
| - @simd for i = 1:m |
37 |
| - A[i,j] *= b |
38 |
| - end |
| 23 | + COLSHIFT = m*(J-1) |
| 24 | + @inbounds @simd for i = 1:m |
| 25 | + A[i+COLSHIFT] *= b[i] |
39 | 26 | end
|
40 | 27 | A
|
41 | 28 | end
|
42 | 29 |
|
43 |
| -function scale_even_cols!(b::AbstractVector, A::AbstractMatrix) |
| 30 | +function scale_col_J!(b::Number, A::AbstractVecOrMat, J::Int) |
44 | 31 | m, n = size(A)
|
45 |
| - @inbounds for j = 2:2:n |
46 |
| - @simd for i = 1:m |
47 |
| - A[i,j] *= b[i] |
48 |
| - end |
49 |
| - end |
50 |
| - A |
51 |
| -end |
52 |
| - |
53 |
| -function scale_even_cols!(b::Number, A::AbstractMatrix) |
54 |
| - m, n = size(A) |
55 |
| - @inbounds for j = 2:2:n |
56 |
| - @simd for i = 1:m |
57 |
| - A[i,j] *= b |
58 |
| - end |
| 32 | + COLSHIFT = m*(J-1) |
| 33 | + @inbounds @simd for i = 1:m |
| 34 | + A[i+COLSHIFT] *= b |
59 | 35 | end
|
60 | 36 | A
|
61 | 37 | end
|
@@ -348,27 +324,23 @@ function A_mul_B!(Y::Matrix, P::ChebyshevToNormalizedLegendrePlan, X::Matrix)
|
348 | 324 | scale!(P.scl, Y)
|
349 | 325 | end
|
350 | 326 |
|
351 |
| -function A_mul_B_odd_cols!!(Y::Matrix, P::NormalizedLegendreToChebyshevPlan, X::Matrix) |
| 327 | +function A_mul_B_col_J!!(Y::Matrix, P::NormalizedLegendreToChebyshevPlan, X::Matrix, J::Int) |
352 | 328 | m, n = size(X)
|
353 |
| - scale_odd_cols!(P.scl, X) |
354 |
| - for j = 1:2:n |
355 |
| - A_mul_B!(Y, P.even, X, 1+m*(j-1), 1+m*(j-1), 2, 2) |
356 |
| - A_mul_B!(Y, P.odd, X, 2+m*(j-1), 2+m*(j-1), 2, 2) |
357 |
| - end |
358 |
| - scale_odd_cols!(2/π, Y) |
359 |
| - @inbounds @simd for j = 1:2:n |
360 |
| - Y[1+m*(j-1)] *= 0.5 |
361 |
| - end |
| 329 | + COLSHIFT = m*(J-1) |
| 330 | + scale_col_J!(P.scl, X, J) |
| 331 | + A_mul_B!(Y, P.even, X, 1+COLSHIFT, 1+COLSHIFT, 2, 2) |
| 332 | + A_mul_B!(Y, P.odd, X, 2+COLSHIFT, 2+COLSHIFT, 2, 2) |
| 333 | + scale_col_J!(2/π, Y, J) |
| 334 | + @inbounds Y[1+COLSHIFT] *= 0.5 |
362 | 335 | Y
|
363 | 336 | end
|
364 | 337 |
|
365 |
| -function A_mul_B_odd_cols!(Y::Matrix, P::ChebyshevToNormalizedLegendrePlan, X::Matrix) |
| 338 | +function A_mul_B_col_J!(Y::Matrix, P::ChebyshevToNormalizedLegendrePlan, X::Matrix, J::Int) |
366 | 339 | m, n = size(X)
|
367 |
| - for j = 1:2:n |
368 |
| - A_mul_B!(Y, P.even, X, 1+m*(j-1), 1+m*(j-1), 2, 2) |
369 |
| - A_mul_B!(Y, P.odd, X, 2+m*(j-1), 2+m*(j-1), 2, 2) |
370 |
| - end |
371 |
| - scale_odd_cols!(P.scl, Y) |
| 340 | + COLSHIFT = m*(J-1) |
| 341 | + A_mul_B!(Y, P.even, X, 1+COLSHIFT, 1+COLSHIFT, 2, 2) |
| 342 | + A_mul_B!(Y, P.odd, X, 2+COLSHIFT, 2+COLSHIFT, 2, 2) |
| 343 | + scale_col_J!(P.scl, Y, J) |
372 | 344 | end
|
373 | 345 |
|
374 | 346 | ################################################################################
|
@@ -468,21 +440,19 @@ function A_mul_B!(Y::Matrix, P::Chebyshev2ToNormalizedLegendre1Plan, X::Matrix)
|
468 | 440 | scale!(P.scl, Y)
|
469 | 441 | end
|
470 | 442 |
|
471 |
| -function A_mul_B_even_cols!!(Y::Matrix, P::NormalizedLegendre1ToChebyshev2Plan, X::Matrix) |
| 443 | +function A_mul_B_col_J!!(Y::Matrix, P::NormalizedLegendre1ToChebyshev2Plan, X::Matrix, J::Int) |
472 | 444 | m, n = size(X)
|
473 |
| - scale_even_cols!(P.scl, X) |
474 |
| - for j = 2:2:n |
475 |
| - A_mul_B!(Y, P.even, X, 1+m*(j-1), 1+m*(j-1), 2, 2) |
476 |
| - A_mul_B!(Y, P.odd, X, 2+m*(j-1), 2+m*(j-1), 2, 2) |
477 |
| - end |
| 445 | + COLSHIFT = m*(J-1) |
| 446 | + scale_col_J!(P.scl, X, J) |
| 447 | + A_mul_B!(Y, P.even, X, 1+COLSHIFT, 1+COLSHIFT, 2, 2) |
| 448 | + A_mul_B!(Y, P.odd, X, 2+COLSHIFT, 2+COLSHIFT, 2, 2) |
478 | 449 | Y
|
479 | 450 | end
|
480 | 451 |
|
481 |
| -function A_mul_B_even_cols!(Y::Matrix, P::Chebyshev2ToNormalizedLegendre1Plan, X::Matrix) |
| 452 | +function A_mul_B_col_J!(Y::Matrix, P::Chebyshev2ToNormalizedLegendre1Plan, X::Matrix, J::Int) |
482 | 453 | m, n = size(X)
|
483 |
| - for j = 2:2:n |
484 |
| - A_mul_B!(Y, P.even, X, 1+m*(j-1), 1+m*(j-1), 2, 2) |
485 |
| - A_mul_B!(Y, P.odd, X, 2+m*(j-1), 2+m*(j-1), 2, 2) |
486 |
| - end |
487 |
| - scale_even_cols!(P.scl, Y) |
| 454 | + COLSHIFT = m*(J-1) |
| 455 | + A_mul_B!(Y, P.even, X, 1+COLSHIFT, 1+COLSHIFT, 2, 2) |
| 456 | + A_mul_B!(Y, P.odd, X, 2+COLSHIFT, 2+COLSHIFT, 2, 2) |
| 457 | + scale_col_J!(P.scl, Y, J) |
488 | 458 | end
|
0 commit comments