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