Help vectorising for loop for kernel density
1 vue (au cours des 30 derniers jours)
Afficher commentaires plus anciens
I am having a devil of a time figuring out how to vectorise the following for loopp
dens = NaN(length(y),1);
for i=1:length(y)
dens(i) = (1/(n*h))*sum(kernel((Y-y(i))/h));
end
Where Y has 1000 points and y has 50 points, i think perhaps it could be done by subtracting each element in y from Y such that i get a 1000 by 50 matrix. And then i can sum across columns to get the result perhaps ? but that would requre some fairly large matrices for changed dimensions and i also dont know how to do it
any help will be greatly appreciated
2 commentaires
Réponse acceptée
Matt Fig
le 24 Nov 2012
Modifié(e) : Matt Fig
le 24 Nov 2012
With these values for Y and y:
Y = rand(10,1)*10;
y = rand(5,1)*10;
This gives the same result as your FOR loop:
D = (1/(n*h))*sum(kernel(bsxfun(@minus,Y.',y)/h),2);
Here is the code I used to check the equality of the two approaches, in case it helps you:
Y = rand(1000,1)*10;
y = rand(50,1)*10;
dens = NaN(length(y),1);
n = length(Y);
h = .15;
kernel = @(z) exp((-z.^2)./2)./sqrt(2*pi);
for i=1:length(y)
dens(i) = (1/(n*h))*sum(kernel((Y-y(i))/h));
end
D = (1/(n*h))*sum(kernel(bsxfun(@minus,Y.',y)/h),2);
isequal(dens,D) % Check for equality.
5 commentaires
Matt Fig
le 25 Nov 2012
So is it working now? Did you copy and paste my test code to see that it is working? Those dimensions are identical to my test code. Are you sure about the other variables being as I show, and the kernel function?
Plus de réponses (0)
Voir également
Catégories
En savoir plus sur Logical dans Help Center et File Exchange
Produits
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!