Bonjour à tous,
Le titre a l'air barbare, mais le vrai problème est de pouvoir enlever la boucle "for" de l'algorithme qui est présenté ci-dessous :
En effet, plus le signal 1D (fourni ici dans le paramètre "diracVect") à traiter est grand, plus l'algorithme prends du temps à s'exécuter, ce qui est normal ... Mais cela peut atteindre plusieurs dizaines de minutes pour moins de 10 minutes de signal !!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 function estimated = kernel_smoothing( time, diracVect, Sf, KW) Ts = 1/Sf; %Sampling Time estimated = zeros(length(time), 1); N = length(time); n = 1:N; %check that time starts from 0 second rescaled_time = time - time(1); for k = 1:N inside_b = abs( k*Ts - rescaled_time(n) )/KW; b_res = Gaussian_kernel_func(inside_b); numerator = sum(diracVect .* b_res); denominator = sum(b_res); estimated(k) = numerator/denominator; end end
J'ai essayé plusieurs tentatives depuis hier, mais aucune ne m'a apporté satisfaction (au niveau temps ou résultat final).
Ca serait pas mal si quelqu'un pouvait ne serait-ce que m'aiguiller vers une bonne solution
PS : pour l'histoire, la fonction gaussienne est la suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 function r = Gaussian_kernel_func(u) % % [ exp((-u^2)/2)) if -5 <= u <= 5 % b(u) = { % [ 0 otherwise % in_bound = find( (-5 <= u) & (u <= 5)); r = zeros(size(u)); r(in_bound) = exp((-u(in_bound).^2)/2); end
Partager