1
+
2
+ function _kappamatrix! (κ:: Kernel{T} , P:: AbstractMatrix{T} ) where {T<: Real }
3
+ for i in eachindex (P)
4
+ @inbounds P[i] = kappa (κ, P[i])
5
+ end
6
+ P
7
+ end
8
+
9
+ function _symmetric_kappamatrix! (
10
+ κ:: Kernel{T} ,
11
+ P:: AbstractMatrix{T} ,
12
+ symmetrize:: Bool
13
+ ) where {T<: Real }
14
+ if ! ((n = size (P,1 )) == size (P,2 ))
15
+ throw (DimensionMismatch (" Pairwise matrix must be square." ))
16
+ end
17
+ for j = 1 : n, i = (1 : j)
18
+ @inbounds P[i,j] = kappa (κ, P[i,j])
19
+ end
20
+ symmetrize ? LinearAlgebra. copytri! (P, ' U' ) : P
21
+ end
22
+
23
+
1
24
"""
2
25
```
3
26
kernelmatrix!(K::Matrix, κ::Kernel, X::Matrix, Y::Matrix; obsdim::Integer=2)
4
27
```
5
28
In-place version of `kernelmatrix` where pre-allocated matrix `K` will be overwritten with the kernel matrix.
6
29
"""
7
30
function kernelmatrix! (
8
- K:: Matrix{T} ,
31
+ K:: Matrix{T₁ } ,
9
32
κ:: Kernel{T} ,
10
- X:: AbstractMatrix{T} ,
11
- Y:: AbstractMatrix{T} ;
12
- obsdim:: Integer = defaultobs
13
- ) where {T<: Real }
14
- basematrix! (σ, K, basefunction (κ), κ . α, X, Y)
15
- kappamatrix ! (κ, K )
33
+ X:: AbstractMatrix{T₂ } ,
34
+ Y:: AbstractMatrix{T₃ } ;
35
+ obsdim:: Int = defaultobs
36
+ ) where {T,T₁,T₂,T₃ }
37
+ # TODO Check dimension consistency
38
+ _kappamatrix ! (κ, pairwise! (K, metric (κ), X, Y, dims = obsdim) )
16
39
end
17
40
18
- function kernelmatrix (
41
+
42
+ function kernelmatrix! (
43
+ K:: Matrix{T₁} ,
19
44
κ:: Kernel{T} ,
20
- X:: AbstractMatrix{T} ;
45
+ X:: AbstractMatrix{T₂ } ;
21
46
obsdim:: Int = defaultobs,
22
47
symmetrize:: Bool = true
23
- ) where {T<: Real }
24
- return symmetric_kappamatrix! (κ,pairwise (basefunction (κ),X,dims= obsdim),symmetrize)
48
+ ) where {T,T₁<: Real ,T₂<: Real }
49
+ # TODO Check dimension consistency
50
+ _symmetric_kappamatrix! (κ,pairwise! (metric (κ),X,dims= obsdim),symmetrize)
25
51
end
26
52
27
- function kernelmatrix (
28
- κ:: Kernel{T} ,
29
- X:: AbstractMatrix{T} ,
30
- Y:: AbstractMatrix{T} ;
31
- obsdim:: Int = defaultobs
32
- ) where {T<: Real }
33
- kappamatrix! (κ, pairwise (basefunction (κ), X, Y, dims= obsdim))
34
- end
35
-
36
-
37
53
# Convenience Methods ======================================================================
38
54
39
55
"""
40
- kernel(κ::Kernel, x, y)
41
-
56
+ ```
57
+ kernel(κ::Kernel, x, y; obsdim=2)
58
+ ```
42
59
Apply the kernel `κ` to ``x`` and ``y`` where ``x`` and ``y`` are vectors or scalars of
43
60
some subtype of ``Real``.
44
61
"""
48
65
49
66
function kernel (
50
67
κ:: Kernel{T} ,
51
- x:: AbstractArray{T1 } ,
52
- y:: AbstractArray{T2 } ;
68
+ x:: AbstractArray{T₁ } ,
69
+ y:: AbstractArray{T₂ } ;
53
70
obsdim:: Int = defaultobs
54
- ) where {T,T1<: Real ,T2<: Real }
55
- kappamatrix! (κ, pairwise (metric (κ),X,Y,dims= obsdim))
71
+ ) where {T,T₁<: Real ,T₂<: Real }
72
+ # TODO Verify dimensions
73
+ _kappamatrix! (κ, pairwise (metric (κ),X,Y,dims= obsdim))
56
74
end
57
75
58
76
"""
@@ -63,23 +81,39 @@ Calculate the kernel matrix of `X` with respect to kernel `κ`.
63
81
"""
64
82
function kernelmatrix (
65
83
κ:: Kernel{T} ,
66
- X:: AbstractMatrix{T1 } ;
84
+ X:: AbstractMatrix{T₁ } ;
67
85
obsdim:: Int = defaultobs,
68
86
symmetrize:: Bool = true
69
- ) where {T,T1 }
70
- return symmetric_kappamatrix ! (κ,pairwise (basefunction (κ),X,dims= obsdim),symmetrize)
87
+ ) where {T,T₁ <: Real }
88
+ return _symmetric_kappamatrix ! (κ,pairwise (metric (κ),X,dims= obsdim),symmetrize)
71
89
end
72
90
73
91
"""
92
+ ```
74
93
kernelmatrix(κ::Kernel, X::Matrix, Y::Matrix; obsdim::Int=2)
75
-
94
+ ```
76
95
Calculate the base matrix of `X` and `Y` with respect to kernel `κ`.
77
96
"""
78
97
function kernelmatrix (
79
98
κ:: Kernel{T} ,
80
- X:: AbstractMatrix{T1 } ,
81
- Y:: AbstractMatrix{T2 } ;
99
+ X:: AbstractMatrix{T₁ } ,
100
+ Y:: AbstractMatrix{T₂ } ;
82
101
obsdim= defaultobs
83
- ) where {T,T1,T2}
84
- kappamatrix! (κ, pairwise (basefunction (κ), X, Y, dims= dim (σ)))
102
+ ) where {T,T₁<: Real ,T₂<: Real }
103
+ _kappamatrix! (κ, pairwise (metric (κ), X, Y, dims= obsdim))
104
+ end
105
+
106
+
107
+ """
108
+ ```
109
+ kerneldiagmatrix(κ::Kernel, X::Matrix; obsdim::Int=2)
110
+ ```
111
+ Calculate the diagonal matrix of `X` with respect to kernel `κ`
112
+ """
113
+ function kerneldiagmatrix (
114
+ κ:: Kernel{T} ,
115
+ X:: AbstractMatrix{T₁}
116
+ ) where {T,T₁,T₂}
117
+ @error " Not implemented yet"
118
+ # TODO
85
119
end
0 commit comments