[Scilab-users] funny result for tensor norm calculation

Adrien Vogt-Schilb vogt at centre-cired.fr
Wed Sep 26 22:31:55 CEST 2012


On 26/09/2012 19:42, Paul Carrico wrote:
>
> Dear All,
>
> A funny result for calculating the norm of a tensor ... for ounce a 
> "traditional" method (that probably uses vectorization in back stage) 
> is faster than the norm function ...
>
> Paul
>
> mode(0);
>
> A= [ 1 2 3 ; 4 5 6; 7 8 9]
>
> n= 1000
>
> fori = 1 : n
>
> for j = 1 : n
>
> B(i,j) = i*j;
>
> end
>
> end
>
> /// Scilab function/
>
> _tic_();
>
> _norm_(B)
>
> t1= _toc_()
>
> /// "traditional" method/
>
> /// norm = sqrt(trace(A_transp * A))/
>
> _tic_
>
> norm_= (_trace_(B'*B))**0.5
>
> t2= _toc_()
>
>
Hi
Yep, same result for me, the handmade computation is 4 times faster. 
Maybe norm i written assuming B is a complex hypermatrix or something.

But the real improvement would be to use a "vectorized" code to generate 
B, try this:


tic
n= 1000

fori = 1 : n

for j = 1 : n

B(i,j) = i*j;

end

end
toc


tic
BB=(1:n)'*(1:n);
toc

the second method is several hundred times faster than the first.


Note that the first method uses loops when matrix computations are able 
to do the job, and, worst, B is not initialized.

This means that every while, scilab will notice that B is larger than 
expected, and will ask for a new, larger place in memory to store B, 
will copy the existing B from the old place to the new one, only to find 
out later that B is actually even bigger.
I do not know how exactly this is implemented, but this can happen 
basically for each new value of i, so 1000 time.

The take away message is: when having to building a matrix with a loop, 
"initailize" your matrix:

tic
n= 1000

fori = 1 : n

for j = 1 : n

Bad(i,j) = i*j;

end

end
bad=toc()


tic
Good = zeros(n,n);
n= 1000

fori = 1 : n

for j = 1 : n

Good(i,j) = i*j;

end

end
good=toc()

bad/good

//(in my PC this is already 3x faster)

tic
best=(1:n)'*(1:n);
best=toc()

bad/best
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.scilab.org/pipermail/users/attachments/20120926/ee4e561b/attachment.htm>


More information about the users mailing list