Help vectorising for loop for kernel density

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 个评论

What are n and h, and where is the kernel function?
n = 1000 (number of simulated variables = length(Y), h is the bandwidth = 0.15 and the kernel function i have declared already so when the loop calls kernel(x) it should call that function, the function it self is:
K_Gauss =@(z) exp((-z.^2)./2)./sqrt(2*pi);

请先登录,再进行评论。

 采纳的回答

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 个评论

Hi Matt,
I get the strangest error when i try to apply your code, it says
??? Error using ==> bsxfun
Non-singleton dimensions of the two input arrays must match each other.
However the dimensions seem to match the code you have above, so i cant really see where it would go wrong. Any suggestions ?
What are the dimensions of Y and y?
whos y Y
Name Size Bytes Class Attributes
Y 1000x1 8000 double
y 1x50 400 double
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?
It unfortunately is not working, i accepted the answer by mistake :)
I tested the example code you posted and it works fine, however my main code still does not. I have zipped to a rar file here http://www.mediafire.com/?9o846f8f481q7sr.
Thanks alot for your help btw Matt, i am trying to get into the habbit of vectorizing my code.

请先登录,再进行评论。

更多回答(0 个)

类别

帮助中心File Exchange 中查找有关 Loops and Conditional Statements 的更多信息

产品

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by