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 :
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
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 !!

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