Why is this line so inefficient

3 views (last 30 days)
John Gilmore
John Gilmore on 26 Jul 2022
Commented: David Hill on 27 Jul 2022
I have a very simple equation that I'm coding in MATLAB that I wouldn't think should be taking as much time as it is. The initial line is in a for loop so I vectorized the problem and that turned out to be even slower (which I was pretty surprised by). Does anyone see anything obvious that I'm not considering for why this is so slow? Typically values for n and m are between 0-10
% Rnm = zeros(size(rho));
% MaximumExponent = (n-m)/2;
% s = 0:MaximumExponent;
% numerator = (-1) .^ s .* factorial(n-s);
% denominator = factorial(s) .* factorial((n+m) / 2-s) .* factorial((n-m) / 2-s);
% Rnm = sum((numerator ./ denominator) .* rho .^ (n-2 .* s), 2);
Rnm2 = zeros(size(rho));
for s=0:(n-m)/2
numerator = (-1)^s * factorial(n-s);
denominator = factorial(s)*factorial((n+m)/2-s)*factorial((n-m)/2-s);
Rnm2 = Rnm2 + (numerator / denominator) * rho.^(n-2*s);
end % for s statement
Here is a profile for the runtime...
EDIT: I should probably also add a couple more details on some things. rho will be a column vector of ~500,000 elements. I imagine the size of rho is alone the reason that most of this takes so long, but it still seems a bit abnormally long to me.
EDIT 2: Should probably include my system details...running Windows 10 Pro, 11th Gen Intel Core i5-1135G7 @ 2.4GHz, 16GB RAM. Nothing to fantastic, but not the worst PC in the world. That's why I'd think this should be running faster...

Answers (1)

David Hill
David Hill on 26 Jul 2022
tic;
rho=rand(500000,1);n=9;m=3;
s=0:(n-m)/2;
numerator = (-1).^s .* factorial(n-s);
denominator = factorial(s).*factorial((n+m)/2-s).*factorial((n-m)/2-s);
Rnm=sum((numerator./denominator).*rho.^(n-2*s),2);
toc;
Elapsed time is 0.109334 seconds.
  4 Comments
John Gilmore
John Gilmore on 27 Jul 2022
While the script isn't running? Running that command shows nothing.
David Hill
David Hill on 27 Jul 2022
tic;
rho=rand(500000,1);n=9;m=3;
f=factorial(0:n);%could do lookup table for factorials (might help speed slightly)
s=0:(n-m)/2;
numerator = (-1).^s .* f(n-s+1);
denominator = f(s+1).*f((n+m)/2-s+1).*f((n-m)/2-s+1);
Rnm=sum((numerator./denominator).*rho.^(n-2*s),2);
toc;
Elapsed time is 0.102554 seconds.

Sign in to comment.

Categories

Find more on Memory Usage in Help Center and File Exchange

Products


Release

R2022a

Community Treasure Hunt

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

Start Hunting!