[Scilab-users] vectorization

Paul Carrico paul.carrico at free.fr
Tue Nov 13 08:47:49 CET 2012


Dear all,

 

I’m trying to optimize a part of an existing (but slow) code including a lot
of loops ; naturally I’m thinking in using vectorization  and for that issue
I read the Michaël Baudin’s document (programming in Scilab V0.9) 



 I’ve the feeling the above costly code can be vectorized, but some aspects
are not clear for me at the moment (basically how to transform the double
loop theta/fi in a vector for example ?) 


 

NB:

-          Since the initial tensor is symmetrical, is expressed as a vector

-          To apply transformations, it’s necessary to “rebuild” its matrix
form 
 (compared to a direct calculation , the current solution is faster)

-          This kind of code is currently called hundred thousand times 

clearly not acceptable 


-          I understand we’ve to transform any variable/constant under
vector 


 

Any advice ? where can I find any tutorial or doc that explains and brackets
the use of (efficient) vectorization ?

 

Regards

 

Paul

 

 

 

 

mode(0)

 

// ###############################################################

function E_prime=fct_transformation_M(E, theta, fi)

    // values of theta and fi are in radian

    theta = theta * %pi / 180;

    fi = fi * %pi / 180;

 

    // Calculation of matrix in the studied plane

    E_prime=zeros(3,3);

    M_transform = [

    (cos(theta)* sin(fi)) (sin(theta) * sin(fi)) (cos(fi));

    (-sin(theta)) (cos(theta)) 0. ;

    (-cos(theta) * cos(fi)) (-sin(theta) * cos(fi)) (sin(fi));

    ];

 

    // New tensor calculation

    E_prime = M_transform * E * M_transform';

endfunction

 

function M_new=fct_vector2matrix(M)

    M_new = zeros(3,3);

    M_new(1,1)= M(1,1);

    M_new(2,2)= M(1,2);

    M_new(3,3)= M(1,3);

    M_new(1,2)= M(1,4);

    M_new(2,3)= M(1,5);

    M_new(1,3)= M(1,6);

    M_new(2,1)= M_new(1,2);

    M_new(3,1)= M_new(1,3);

    M_new(3,2)= M_new(2,3);

endfunction

 

function M_vect=fct_matrix2vector(M)

    M_vect = zeros(1,6);

    M_vect(1,1) = M(1,1);

    M_vect(1,2) = M(2,2);

    M_vect(1,3) = M(3,3);

    M_vect(1,4) = M(1,2);

    M_vect(1,5) = M(2,3);

    M_vect(1,6) = M(1,3);

endfunction

// ###############################################################

 

Epsilon = 10^(-8) *[

4.441D-08 0. 0. 0. 0. 0. ;

-1022. -6278. 6914. 210.6 783100. -33910. ;

-2316. -24190. 25930. 894.6 1545000. -67320. ;

-3608. -52660. 55610. 2004. 2284000. -99750. ;

-4895. -90810. 94970. 3508. 3002000. -131300. ;

-6171. -137700. 143100. 5365. 3699000. -161900. ;

-7429. -192400. 199000. 7533. 4373000. -191600. ;

-8675. -254200. 262000. 9997. 5027000. -220400. ;

-8675. -254200. 262000. 9997. 5027000. -220400. 

]

 

[p,c] = size(Epsilon);

// number of time steps

step_ = 2; //

 

nb_loops = 0;

tic()

for i = 1 : p

    for theta = 0 : step_ : 180

        for fi = 0 : step_ : 180

            Epsilon_matrix = fct_vector2matrix(Epsilon(i,:));

            Epsilon_prime_matrix =
fct_transformation_M(Epsilon_matrix,theta,fi);

            Epsilon_prime(i,:) = fct_matrix2vector(Epsilon_prime_matrix);

            nb_loops = nb_loops + 1;

        end

    end

end

t_vect2matr2vect = toc()

nb_loops

 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.scilab.org/pipermail/users/attachments/20121113/9bf30560/attachment.htm>


More information about the users mailing list