@@ -71,10 +71,17 @@ function kernelmatrix!(K::AbstractMatrix, k::KernelTensorProduct, x::AbstractVec
7171 validate_inplace_dims (K, x)
7272 validate_domain (k, x)
7373
74- kernels_and_inputs = zip (k. kernels, slices (x))
75- kernelmatrix! (K, first (kernels_and_inputs)... )
76- for (k, xi) in Iterators. drop (kernels_and_inputs, 1 )
77- K .*= kernelmatrix (k, xi)
74+ first_kernels, tail_kernels = Iterators. peel (k. kernels)
75+ first_x, tail_x = Iterators. peel (slices (x))
76+
77+ # handle first kernel and input
78+ kernelmatrix! (K, first_kernels, first_x)
79+
80+ # handle remaining kernels and inputs
81+ Ktmp = similar (K)
82+ for (ki, xi) in zip (tail_kernels, tail_x)
83+ kernelmatrix! (Ktmp, ki, xi)
84+ hadamard! (K, K, Ktmp)
7885 end
7986
8087 return K
@@ -86,10 +93,18 @@ function kernelmatrix!(
8693 validate_inplace_dims (K, x, y)
8794 validate_domain (k, x)
8895
89- kernels_and_inputs = zip (k. kernels, slices (x), slices (y))
90- kernelmatrix! (K, first (kernels_and_inputs)... )
91- for (k, xi, yi) in Iterators. drop (kernels_and_inputs, 1 )
92- K .*= kernelmatrix (k, xi, yi)
96+ first_kernels, tail_kernels = Iterators. peel (k. kernels)
97+ first_x, tail_x = Iterators. peel (slices (x))
98+ first_y, tail_y = Iterators. peel (slices (y))
99+
100+ # handle first kernel and inputs
101+ kernelmatrix! (K, first_kernels, first_x, first_y)
102+
103+ # handle remaining kernels and inputs
104+ Ktmp = similar (K)
105+ for (ki, xi, yi) in zip (tail_kernels, tail_x, tail_y)
106+ kernelmatrix! (Ktmp, ki, xi, yi)
107+ hadamard! (K, K, Ktmp)
93108 end
94109
95110 return K
@@ -99,10 +114,40 @@ function kernelmatrix_diag!(K::AbstractVector, k::KernelTensorProduct, x::Abstra
99114 validate_inplace_dims (K, x)
100115 validate_domain (k, x)
101116
102- kernels_and_inputs = zip (k. kernels, slices (x))
103- kernelmatrix_diag! (K, first (kernels_and_inputs)... )
104- for (k, xi) in Iterators. drop (kernels_and_inputs, 1 )
105- K .*= kernelmatrix_diag (k, xi)
117+ first_kernels, tail_kernels = Iterators. peel (k. kernels)
118+ first_x, tail_x = Iterators. peel (slices (x))
119+
120+ # handle first kernel and input
121+ kernelmatrix_diag! (K, first_kernels, first_x)
122+
123+ # handle remaining kernels and inputs
124+ Ktmp = similar (K)
125+ for (ki, xi) in zip (tail_kernels, tail_x)
126+ kernelmatrix_diag! (Ktmp, ki, xi)
127+ hadamard! (K, K, Ktmp)
128+ end
129+
130+ return K
131+ end
132+
133+ function kernelmatrix_diag! (
134+ K:: AbstractVector , k:: KernelTensorProduct , x:: AbstractVector , y:: AbstractVector
135+ )
136+ validate_inplace_dims (K, x, y)
137+ validate_domain (k, x)
138+
139+ first_kernels, tail_kernels = Iterators. peel (k. kernels)
140+ first_x, tail_x = Iterators. peel (slices (x))
141+ first_y, tail_y = Iterators. peel (slices (y))
142+
143+ # handle first kernel and inputs
144+ kernelmatrix_diag! (K, first_kernels, first_x, first_y)
145+
146+ # handle remaining kernels and inputs
147+ Ktmp = similar (K)
148+ for (ki, xi, yi) in zip (tail_kernels, tail_x, tail_y)
149+ kernelmatrix_diag! (Ktmp, ki, xi, yi)
150+ hadamard! (K, K, Ktmp)
106151 end
107152
108153 return K
0 commit comments