1
$\begingroup$

Half the run time of my code right now is evaluating a big function over many, many points, it takes maybe about 20 seconds per evaluation

The function consists of a bunch of simple operations that look like

Ux = ((1./72).*(x.^2+y.^2+z.^2).^(-5./2).*((-5).*x.*(4.*x.^4+3.*y.^2.*( ...
  y.^2+z.^2)+x.^2.*(7.*y.^2+z.^2)).*gx^2+(-10).*y.*(3.*x.^4+5.* ...
  x.^2.*y.^2+2.*y.^2.*(y.^2+z.^2)).*gx.*gy+5.*x.*(x.^4+3.*y.^2.* ...
  z.^2+x.^2.*(y.^2+z.^2)).*gy^2)); 

is there any way to speed this up? Additionally it spends like 10% of this function evaluation concatenating these large matrices as

U =[Ux;Uy;Uz];

Are there any tricks to speeding up these sorts of evaluations?

$\endgroup$
4
$\begingroup$

I see that you are doing some redundant computation, for example y.^2+z.^2 is computed 4 times, with y.^2 and z.^2 are computed 9-10 times. You can define a set of variables y2=y.^2, z2=y.^2, y2pz2=y2+z2; and push some of the computation cost to memory -given that you have enough memory. That would save you a good amount of time.

MATLAB is a column-major language. Looking at your code, Ux, Uy and Uz seem to be row vectors and you are putting them on top of each other U =[Ux;Uy;Uz];. That will be slow. If possible, defining U =[Ux',Uy',Uz']; should reduce the time spent concatenating.

| cite | improve this answer | |
$\endgroup$
1
$\begingroup$

Have you tried arrayfun? If the arrays are really large (how large are we speaking, by the way?), it might be possible that allocating all those temporaries has a cost that arrayfun would save.

Also, instead of concatenating, you could preallocate U and fill it one block at a time.

| cite | improve this answer | |
$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.