MATLAB Answers

Efficient code writing...

2 views (last 30 days)
Daniel
Daniel on 16 Nov 2011
Hi all. First time posting here, hope I can get some nice ideas. I have 3 large matrices (of equal size), representing the x,y and z coordinates of points. So say my matrices are 200 by 200, it means they are representing 200x200 points. Now, I want to apply this transformation matrix to each point, so that I get some linear combination of the point being transformed. Of course, I know I could opt for a loop where I update the indices of my matrices and each time apply the transformation. But I'd like to know how I can do this more efficiently... I know matlab works better using vectorisation, so I am thinking along the lines of using structures or something... Any ideas?
Thanks. Dan
  4 Comments
Daniel
Daniel on 16 Nov 2011
Sorry I meant to write,
CS(:,:,1)=x;
CS(:,:,2)=y;
CS(:,:,3)=z;

Sign in to comment.

Accepted Answer

Andrei Bobrov
Andrei Bobrov on 16 Nov 2011
variant
C = cat(3,x, y, z);
s = size(C);
Cout = permute(reshape(M*reshape(permute(C,[3 2 1]),s(3),[]),s(3),s(2),[]),[3 2 1]);
variant 2
Cout2 = C;
for i1 = 1:size(C,2)
Cout2(:,i1,:) = (M*squeeze(C(:,i1,:)).').';
end

More Answers (2)

Sean de Wolski
Sean de Wolski on 16 Nov 2011
A well written for-loop should be pretty fast. I would recommend doing that. make sure to preallocate your matrix of transformations to be equal to its final size.

Daniel
Daniel on 16 Nov 2011
Just FYI... I tested andrei's suggestion with three, 100x100 matrices. I compared its speed with that of the loop method. Andrei's method clocked in at 0.00195sec, whilst the loop method clocked in at 0.0195 ... so andrei's method is 10x faster!! think of larger simulations...this could really be effective :D thanks all again for the suggestions Dan

Community Treasure Hunt

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

Start Hunting!