1
-
2
- function _kappamatrix! (κ:: Kernel{T} , P:: AbstractMatrix{T₁} ) where {T<: Real ,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! (
1
+ """
2
+ ```
3
+ kernelmatrix!(K::Matrix, κ::Kernel, X::Matrix; obsdim::Integer=2, symmetrize::Bool=true)
4
+ ```
5
+ In-place version of `kernelmatrix` where pre-allocated matrix `K` will be overwritten with the kernel matrix.
6
+ """
7
+ function kernelmatrix! (
8
+ K:: Matrix{T₁} ,
10
9
κ:: Kernel{T} ,
11
- P:: AbstractMatrix{T₁} ,
12
- symmetrize:: Bool
13
- ) where {T<: Real ,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
10
+ X:: AbstractMatrix{T₂} ;
11
+ obsdim:: Int = defaultobs,
12
+ symmetrize:: Bool = true
13
+ ) where {T,T₁<: Real ,T₂<: Real }
14
+ @assert check_dims (K,X,X,obsdim) " Dimensions of the target array are not consistent with X and Y"
15
+ map! (x-> kappa (κ,x),K,pairwise (metric (κ),transform (κ,X,obsdim),dims= obsdim))
21
16
end
22
17
23
-
24
18
"""
25
19
```
26
20
kernelmatrix!(K::Matrix, κ::Kernel, X::Matrix, Y::Matrix; obsdim::Integer=2)
@@ -34,24 +28,10 @@ function kernelmatrix!(
34
28
Y:: AbstractMatrix{T₃} ;
35
29
obsdim:: Int = defaultobs
36
30
) where {T,T₁,T₂,T₃}
37
- # TODO Check dimension consistency
38
- _kappamatrix! (κ, pairwise! (K, metric (κ), X, Y, dims= obsdim))
39
- end
40
-
41
-
42
- function kernelmatrix! (
43
- K:: Matrix{T₁} ,
44
- κ:: Kernel{T} ,
45
- X:: AbstractMatrix{T₂} ;
46
- obsdim:: Int = defaultobs,
47
- symmetrize:: Bool = true
48
- ) where {T,T₁<: Real ,T₂<: Real }
49
- # TODO Check dimension consistency
50
- _symmetric_kappamatrix! (κ,pairwise! (K, metric (κ), X, dims= obsdim), symmetrize)
31
+ @assert check_dims (K,X,Y,obsdim) " Dimensions of the target array are not consistent with X and Y"
32
+ map! (x-> kappa (κ,x),K,pairwise (metric (κ),transform (κ,X,obsdim),transform (κ,Y,obsdim),dims= obsdim))
51
33
end
52
34
53
- # Convenience Methods ======================================================================
54
-
55
35
"""
56
36
```
57
37
kernel(κ::Kernel, x, y; obsdim=2)
@@ -60,7 +40,7 @@ Apply the kernel `κ` to ``x`` and ``y`` where ``x`` and ``y`` are vectors or sc
60
40
some subtype of ``Real``.
61
41
"""
62
42
function kernel (κ:: Kernel{T} , x:: Real , y:: Real ) where {T}
63
- kernel (κ, T (x), T (y))
43
+ kernel (κ, [ T (x)], [ T (y)] )
64
44
end
65
45
66
46
function kernel (
@@ -69,25 +49,23 @@ function kernel(
69
49
y:: AbstractArray{T₂} ;
70
50
obsdim:: Int = defaultobs
71
51
) where {T,T₁<: Real ,T₂<: Real }
72
- # TODO Verify dimensions
73
- kappa (κ, evaluate (metric (κ),x,y ))
52
+ @assert length (x) == length (y) " x and y don't have the same dimension! "
53
+ kappa (κ, evaluate (metric (κ),transform (κ,x), transform (κ,y) ))
74
54
end
75
55
76
56
"""
77
57
```
78
- kernelmatrix(κ::Kernel, X::Matrix ; obsdim::Int=2, symmetrize::Bool)
58
+ kernelmatrix(κ::Kernel, X::Matrix ; obsdim::Int=2, symmetrize::Bool=true )
79
59
```
80
60
Calculate the kernel matrix of `X` with respect to kernel `κ`.
81
61
"""
82
62
function kernelmatrix (
83
- κ:: Kernel{T} ,
84
- X:: AbstractMatrix{T₁} ;
63
+ κ:: Kernel{T,<:Transform } ,
64
+ X:: AbstractMatrix ;
85
65
obsdim:: Int = defaultobs,
86
66
symmetrize:: Bool = true
87
- ) where {T,T₁<: Real }
88
- Tₛ = typeof (zero (eltype (X))* zero (T))
89
- m = size (X,obsdim)
90
- return kernelmatrix! (Matrix {promote_float(T,T₁)} (undef,m,m),κ,X,obsdim= obsdim,symmetrize= symmetrize)
67
+ ) where {T}
68
+ K = map (x-> kappa (κ,x),pairwise (metric (κ),transform (κ,X,obsdim),dims= obsdim))
91
69
end
92
70
93
71
"""
@@ -102,13 +80,10 @@ function kernelmatrix(
102
80
Y:: AbstractMatrix{T₂} ;
103
81
obsdim= defaultobs
104
82
) where {T,T₁<: Real ,T₂<: Real }
105
- Tₛ = typeof (zero (eltype (X))* zero (eltype (Y))* zero (T))
106
- m = size (X,obsdim)
107
- n = size (Y,obsdim)
108
- kernelmatrix! (Matrix {Tₛ} (undef,m,n),κ,X,Y,obsdim= obsdim)
83
+ K = map (x-> kappa (κ,x),pairwise (metric (κ),transform (κ,X,obsdim),transform (κ,Y,obsdim),dims= obsdim))
84
+ return K
109
85
end
110
86
111
-
112
87
"""
113
88
```
114
89
kerneldiagmatrix(κ::Kernel, X::Matrix; obsdim::Int=2)
@@ -117,8 +92,30 @@ Calculate the diagonal matrix of `X` with respect to kernel `κ`
117
92
"""
118
93
function kerneldiagmatrix (
119
94
κ:: Kernel{T} ,
120
- X:: AbstractMatrix{T₁}
95
+ X:: AbstractMatrix{T₁} ;
96
+ obsdim:: Int = defaultobs
97
+ ) where {T,T₁}
98
+ if obsdim == 1
99
+ [@views kernel (κ,X[i,:],X[i,:]) for i in 1 : size (X,obsdim)]
100
+ elseif obsdim == 2
101
+ [@views kernel (κ,X[i,:],X[i,:]) for i in 1 : size (X,obsdim)]
102
+ end
103
+ end
104
+
105
+ function kerneldiagmatrix! (
106
+ K:: AbstractVector{T₁} ,
107
+ κ:: Kernel{T} ,
108
+ X:: AbstractMatrix{T₂} ;
109
+ obsdim:: Int = defaultobs
121
110
) where {T,T₁,T₂}
122
- @error " Not implemented yet"
123
- # TODO
111
+ if obsdim == 1
112
+ for i in eachindex (K)
113
+ @inbounds @views K[i] = kernel (κ, X[i,:],X[i,:])
114
+ end
115
+ else
116
+ for i in eachindex (K)
117
+ @inbounds @views K[i] = kernel (κ,X[:,i],X[:,i])
118
+ end
119
+ end
120
+ return K
124
121
end
0 commit comments