MATLAB Answers

for-loop vectorization and structure

3 views (last 30 days)
Hello all,
I've tried to vectorize the following for-loop:
for i=1:ne
S(1,i).P(1,1).x = [v_proj(fv(i,1),1) v_proj(fv(i,2),1)
v_proj(fv(i,3),1)];
S(1,i).P(1,1).y = [v_proj(fv(i,1),2) v_proj(fv(i,2),2)
v_proj(fv(i,3),2)];
S(1,i).P(1,1).hole = 0;
end
But unfortunately I did not manage to do so. I've tried what follows:
S(1:ne).P.x = [v_proj(fv(1:ne,1),1) v_proj(fv(1:ne,2),1) v_proj(fv(1:ne,3),1)];
Even though everything turns out to be correct for the right-hand side, it does not work for the left one as I would have expected. Can anyone help? Because I really need to feed this structure in a more efficient way and increase original poor speed of the algorithm.
Thank you very much for your help,
Regards,
% Romain

  0 Comments

Sign in to comment.

Accepted Answer

Walter Roberson
Walter Roberson on 8 Mar 2012
t = mat2cell( [v_proj(fv(1:ne,1),1) v_proj(fv(1:ne,2),1) v_proj(fv(1:ne,3),1)], ones(1,ne), 3);
[S(1:ne).P.x] = t{:};
This is not tested but it looks about right.

  3 Comments

Jan
Jan on 8 Mar 2012
@Walter: Do you assume that v_proj and fv are arrays?
@Romain: I very curious about a timing comparison...
Romain W
Romain W on 8 Mar 2012
@Walter: thank you for your reply, unfortunately I get the same error message as in what I've tried to do so far: "??? Scalar index required for this type of multi-level indexing."
@Jan: if the error mentioned above can be fixed,I will post a timing comparison using my data. And thank you for your reply again.
Jan
Jan on 8 Mar 2012
The [S(index).B.C] operation does not work for non-scalar "index". Matlab resolves on level of substructs only, e.g. [S(index).B].

Sign in to comment.

More Answers (1)

Jan
Jan on 8 Mar 2012
The vectorized version will not be faster, as far as I can see.
Creating the potentially large array [v_proj(fv(1:ne,1),1) v_proj(fv(1:ne,2),1) v_proj(fv(1:ne,3),1)] will allocate a lot of memory. Spliiting it afterwards to vectors will require more memory. Therefore the overall procedure is most likely less efficient than your FOR-loop.
Please try this:
P.hole = 0;
for i = ne:-1:1 % Backwards for implicite pre-allocation
P.x = [v_proj(fv(i,1),1), v_proj(fv(i,2),1), v_proj(fv(i,3),1)];
P.y = [v_proj(fv(i,1),2), v_proj(fv(i,2),2), v_proj(fv(i,3),2)];
S(i, 1).P = P;
end
what is v_proj and fv? Arrays or functions? Would something like this work:
t = fv(i, 1:3);
P.x = v_proj(t, 1);
P.y = v_proj(t, 2);

  1 Comment

Romain W
Romain W on 8 Mar 2012
Thank you for your reply. I am gonna try your solution. v_proj is a matrix size [ne x 2]

Sign in to comment.

Community Treasure Hunt

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

Start Hunting!