MATLAB: Is there a better vectorization technique

matrixvectorization

I am trying to see if there are other ways of coding this code sample more efficiently. Here, y is an 1xM matrix, (say, 1×1000), and z is an NxM matrix, (say, 5×1000).
mean(ones(N,1)*y.^3 .* z,2)
This code works fine, but I worry of N increases a lot, that the:
ones(N,1)*y.^3
might get too wasteful and make everything slow down.
Thoughts?

Best Answer

  • Its not THAT terrible for a matrix that small. However, you can gain from the use of bsxfun in many instances. Here, the matrices are simply too small to really gain anything.
    >> N = 5;M =1000;
    >> y = rand(1,M);
    >> z = rand(N,M);
    >> mean(ones(N,1)*y.^3 .* z,2)
    ans =
    0.12412
    0.11669
    0.12102
    0.11976
    0.12196
    >> mean(bsxfun(@times,y.^3,z),2)
    ans =
    0.12412
    0.11669
    0.12102
    0.11976
    0.12196
    >> z*y.'.^3/M
    ans =
    0.12412
    0.11669
    0.12102
    0.11976
    0.12196
    As you can see, all three solutions return the same result. All are equally valid.
    Now I'll compare the times required.
    >> timeit(@() mean(ones(N,1)*y.^3 .* z,2))
    ans =
    0.00023018
    >> timeit(@() mean(bsxfun(@times,y.^3,z),2))
    ans =
    0.00026829
    >> timeit(@() z*y.'.^3/M)
    ans =
    0.00016594
    As I said, you don't gain much. In fact, bsxfun does not gain at all, and is a bit slower. But you can gain a bit, if you re-write the expression into the third form I've posed. Not much, but a bit.