<html>
<head>
<meta content="text/html; charset=ISO-8859-1"
http-equiv="Content-Type">
</head>
<body bgcolor="#FFFFFF" text="#330000">
<div class="moz-cite-prefix">On 26/09/2012 19:42, Paul Carrico
wrote:<br>
</div>
<blockquote
cite="mid:000301cd9c0e$47768fc0$d663af40$@carrico@free.fr"
type="cite">
<meta http-equiv="Content-Type" content="text/html;
charset=ISO-8859-1">
<meta name="Generator" content="Microsoft Word 12 (filtered
medium)">
<style><!--
/* Font Definitions */
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
{font-family:Monospaced;
panose-1:0 0 0 0 0 0 0 0 0 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0cm;
margin-bottom:.0001pt;
font-size:11.0pt;
font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
{mso-style-priority:99;
color:blue;
text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
{mso-style-priority:99;
color:purple;
text-decoration:underline;}
pre
{mso-style-priority:99;
mso-style-link:"Pr\00E9format\00E9 HTML Car";
margin:0cm;
margin-bottom:.0001pt;
font-size:10.0pt;
font-family:"Courier New";}
span.EmailStyle17
{mso-style-type:personal-compose;
font-family:"Calibri","sans-serif";
color:windowtext;}
span.PrformatHTMLCar
{mso-style-name:"Pr\00E9format\00E9 HTML Car";
mso-style-priority:99;
mso-style-link:"Pr\00E9format\00E9 HTML";
font-family:"Courier New";}
.MsoChpDefault
{mso-style-type:export-only;}
@page WordSection1
{size:612.0pt 792.0pt;
margin:70.85pt 70.85pt 70.85pt 70.85pt;}
div.WordSection1
{page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
<div class="WordSection1">
<p class="MsoNormal"><span lang="EN-US">Dear All,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">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 …<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Paul<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span
style="font-size:10.5pt;font-family:"Monospaced","serif";color:#32B9B9"
lang="EN-US">mode</span><span
style="font-size:10.5pt;font-family:"Monospaced","serif";color:#4A55DB"
lang="EN-US">(</span><span
style="font-size:10.5pt;font-family:"Monospaced","serif";color:rosybrown"
lang="EN-US">0</span><span
style="font-size:10.5pt;font-family:"Monospaced","serif";color:#4A55DB"
lang="EN-US">)</span><span
style="font-size:10.5pt;font-family:"Monospaced","serif";color:black"
lang="EN-US">;</span><span
style="font-size:10.5pt;font-family:"Monospaced","serif""
lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"><span
style="font-size:10.5pt;font-family:"Monospaced","serif""
lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span
style="font-size:10.5pt;font-family:"Monospaced","serif";color:black"
lang="EN-US">A</span><span
style="font-size:10.5pt;font-family:"Monospaced","serif""
lang="EN-US"> <span style="color:#5C5C5C">=</span> <span
style="color:#4A55DB">[</span> <span
style="color:rosybrown">1</span> <span
style="color:rosybrown">2</span> <span
style="color:rosybrown">3</span> <span
style="color:black">;</span> <span
style="color:rosybrown">4</span> <span
style="color:rosybrown">5</span> <span
style="color:rosybrown">6</span><span style="color:black">;</span>
<span style="color:rosybrown">7</span> <span
style="color:rosybrown">8</span> <span
style="color:rosybrown">9</span><span
style="color:#4A55DB">]</span><o:p></o:p></span></p>
<p class="MsoNormal"><span
style="font-size:10.5pt;font-family:"Monospaced","serif";color:black"
lang="EN-US">n</span><span
style="font-size:10.5pt;font-family:"Monospaced","serif""
lang="EN-US"> <span style="color:#5C5C5C">=</span> <span
style="color:rosybrown">1000</span><o:p></o:p></span></p>
<p class="MsoNormal"><span
style="font-size:10.5pt;font-family:"Monospaced","serif";color:#A020F0"
lang="EN-US">for</span><span
style="font-size:10.5pt;font-family:"Monospaced","serif""
lang="EN-US"> <span style="color:black">i</span> <span
style="color:#5C5C5C">=</span> <span
style="color:rosybrown">1</span> <span
style="color:#FFAA00">:</span> <span style="color:black">n</span><o:p></o:p></span></p>
<p class="MsoNormal"><span
style="font-size:10.5pt;font-family:"Monospaced","serif""
lang="EN-US"> <span style="color:#A020F0">for</span> <span
style="color:black">j</span> <span style="color:#5C5C5C">=</span>
<span style="color:rosybrown">1</span> <span
style="color:#FFAA00">:</span> <span style="color:black">n</span><o:p></o:p></span></p>
<p class="MsoNormal"><span
style="font-size:10.5pt;font-family:"Monospaced","serif""
lang="EN-US"> <span style="color:black">B</span><span
style="color:#4A55DB">(</span><span style="color:black">i,j</span><span
style="color:#4A55DB">)</span> <span
style="color:#5C5C5C">=</span> <span style="color:black">i</span><span
style="color:#5C5C5C">*</span><span style="color:black">j;</span><o:p></o:p></span></p>
<p class="MsoNormal"><span
style="font-size:10.5pt;font-family:"Monospaced","serif""
lang="EN-US"> <span style="color:#A020F0">end</span><o:p></o:p></span></p>
<p class="MsoNormal"><span
style="font-size:10.5pt;font-family:"Monospaced","serif";color:#A020F0"
lang="EN-US">end</span><span
style="font-size:10.5pt;font-family:"Monospaced","serif""
lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"><span
style="font-size:10.5pt;font-family:"Monospaced","serif""
lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><i><span
style="font-size:10.5pt;font-family:"Monospaced","serif";color:#01A801"
lang="EN-US">// Scilab function</span></i><span
style="font-size:10.5pt;font-family:"Monospaced","serif""
lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"><u><span
style="font-size:10.5pt;font-family:"Monospaced","serif";color:#AE5CB0"
lang="EN-US">tic</span></u><span
style="font-size:10.5pt;font-family:"Monospaced","serif";color:#4A55DB"
lang="EN-US">()</span><span
style="font-size:10.5pt;font-family:"Monospaced","serif";color:black"
lang="EN-US">;</span><span
style="font-size:10.5pt;font-family:"Monospaced","serif""
lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"><u><span
style="font-size:10.5pt;font-family:"Monospaced","serif";color:#AE5CB0"
lang="EN-US">norm</span></u><span
style="font-size:10.5pt;font-family:"Monospaced","serif";color:#4A55DB"
lang="EN-US">(</span><span
style="font-size:10.5pt;font-family:"Monospaced","serif";color:black"
lang="EN-US">B</span><span
style="font-size:10.5pt;font-family:"Monospaced","serif";color:#4A55DB"
lang="EN-US">)</span><span
style="font-size:10.5pt;font-family:"Monospaced","serif""
lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"><span
style="font-size:10.5pt;font-family:"Monospaced","serif";color:black"
lang="EN-US">t1</span><span
style="font-size:10.5pt;font-family:"Monospaced","serif""
lang="EN-US"> <span style="color:#5C5C5C">=</span> <u><span
style="color:#AE5CB0">toc</span></u><span
style="color:#4A55DB">()</span><o:p></o:p></span></p>
<p class="MsoNormal"><span
style="font-size:10.5pt;font-family:"Monospaced","serif""
lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><i><span
style="font-size:10.5pt;font-family:"Monospaced","serif";color:#01A801"
lang="EN-US">// "traditional" method</span></i><span
style="font-size:10.5pt;font-family:"Monospaced","serif""
lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"><i><span
style="font-size:10.5pt;font-family:"Monospaced","serif";color:#01A801"
lang="EN-US">// norm = sqrt(trace(A_transp * A))</span></i><span
style="font-size:10.5pt;font-family:"Monospaced","serif""
lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"><u><span
style="font-size:10.5pt;font-family:"Monospaced","serif";color:#AE5CB0"
lang="EN-US">tic</span></u><span
style="font-size:10.5pt;font-family:"Monospaced","serif""
lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"><span
style="font-size:10.5pt;font-family:"Monospaced","serif";color:black">norm_</span><span
style="font-size:10.5pt;font-family:"Monospaced","serif"">
<span style="color:#5C5C5C">=</span> <span
style="color:#4A55DB">(</span><u><span
style="color:#AE5CB0">trace</span></u><span
style="color:#4A55DB">(</span><span style="color:black">B</span><span
style="color:#5C5C5C">'*</span><span style="color:black">B</span><span
style="color:#4A55DB">))</span><span style="color:#5C5C5C">**</span><span
style="color:rosybrown">0.5</span><o:p></o:p></span></p>
<p class="MsoNormal"><span
style="font-size:10.5pt;font-family:"Monospaced","serif";color:black">t2</span><span
style="font-size:10.5pt;font-family:"Monospaced","serif"">
<span style="color:#5C5C5C">=</span> <u><span
style="color:#AE5CB0">toc</span></u><span
style="color:#4A55DB">()</span><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span><br>
</p>
</div>
</blockquote>
Hi<br>
Yep, same result for me, the handmade computation is 4 times faster.
Maybe norm i written assuming B is a complex hypermatrix or
something.<br>
<br>
But the real improvement would be to use a "vectorized" code to
generate B, try this:<br>
<p class="MsoNormal"><span
style="font-size:10.5pt;font-family:"Monospaced","serif";color:black"
lang="EN-US"><br>
tic<br>
n</span><span
style="font-size:10.5pt;font-family:"Monospaced","serif""
lang="EN-US"> <span style="color:#5C5C5C">=</span> <span
style="color:rosybrown">1000</span><o:p></o:p></span></p>
<p class="MsoNormal"><span
style="font-size:10.5pt;font-family:"Monospaced","serif";color:#A020F0"
lang="EN-US">for</span><span
style="font-size:10.5pt;font-family:"Monospaced","serif""
lang="EN-US"> <span style="color:black">i</span> <span
style="color:#5C5C5C">=</span> <span style="color:rosybrown">1</span>
<span style="color:#FFAA00">:</span> <span style="color:black">n</span><o:p></o:p></span></p>
<p class="MsoNormal"><span
style="font-size:10.5pt;font-family:"Monospaced","serif""
lang="EN-US"> <span style="color:#A020F0">for</span> <span
style="color:black">j</span> <span style="color:#5C5C5C">=</span>
<span style="color:rosybrown">1</span> <span
style="color:#FFAA00">:</span> <span style="color:black">n</span><o:p></o:p></span></p>
<p class="MsoNormal"><span
style="font-size:10.5pt;font-family:"Monospaced","serif""
lang="EN-US"> <span style="color:black">B</span><span
style="color:#4A55DB">(</span><span style="color:black">i,j</span><span
style="color:#4A55DB">)</span> <span style="color:#5C5C5C">=</span>
<span style="color:black">i</span><span style="color:#5C5C5C">*</span><span
style="color:black">j;</span><o:p></o:p></span></p>
<p class="MsoNormal"><span
style="font-size:10.5pt;font-family:"Monospaced","serif""
lang="EN-US"> <span style="color:#A020F0">end</span><o:p></o:p></span></p>
<span
style="font-size:10.5pt;font-family:"Monospaced","serif";color:#A020F0"
lang="EN-US">end</span><br>
toc<br>
<br>
<br>
tic<br>
BB=(1:n)'*(1:n);<br>
toc<br>
<br>
the second method is several hundred times faster than the first.<br>
<br>
<br>
Note that the first method uses loops when matrix computations are
able to do the job, and, worst, B is not initialized.<br>
<br>
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.<br>
I do not know how exactly this is implemented, but this can happen
basically for each new value of i, so 1000 time.<br>
<br>
The take away message is: when having to building a matrix with a
loop, "initailize" your matrix:<br>
<br>
<span
style="font-size:10.5pt;font-family:"Monospaced","serif";color:black"
lang="EN-US">tic<br>
n</span><span
style="font-size:10.5pt;font-family:"Monospaced","serif""
lang="EN-US"> <span style="color:#5C5C5C">=</span> <span
style="color:rosybrown">1000</span><o:p></o:p></span>
<p class="MsoNormal"><span
style="font-size:10.5pt;font-family:"Monospaced","serif";color:#A020F0"
lang="EN-US">for</span><span
style="font-size:10.5pt;font-family:"Monospaced","serif""
lang="EN-US"> <span style="color:black">i</span> <span
style="color:#5C5C5C">=</span> <span style="color:rosybrown">1</span>
<span style="color:#FFAA00">:</span> <span style="color:black">n</span><o:p></o:p></span></p>
<p class="MsoNormal"><span
style="font-size:10.5pt;font-family:"Monospaced","serif""
lang="EN-US"> <span style="color:#A020F0">for</span> <span
style="color:black">j</span> <span style="color:#5C5C5C">=</span>
<span style="color:rosybrown">1</span> <span
style="color:#FFAA00">:</span> <span style="color:black">n</span><o:p></o:p></span></p>
<p class="MsoNormal"><span
style="font-size:10.5pt;font-family:"Monospaced","serif""
lang="EN-US"> <span style="color:black">Bad</span><span
style="color:#4A55DB">(</span><span style="color:black">i,j</span><span
style="color:#4A55DB">)</span> <span style="color:#5C5C5C">=</span>
<span style="color:black">i</span><span style="color:#5C5C5C">*</span><span
style="color:black">j;</span><o:p></o:p></span></p>
<p class="MsoNormal"><span
style="font-size:10.5pt;font-family:"Monospaced","serif""
lang="EN-US"> <span style="color:#A020F0">end</span><o:p></o:p></span></p>
<span
style="font-size:10.5pt;font-family:"Monospaced","serif";color:#A020F0"
lang="EN-US">end</span><br>
bad=toc()<br>
<br>
<br>
<span
style="font-size:10.5pt;font-family:"Monospaced","serif";color:black"
lang="EN-US">tic<br>
Good = zeros(n,n);<br>
n</span><span
style="font-size:10.5pt;font-family:"Monospaced","serif""
lang="EN-US"> <span style="color:#5C5C5C">=</span> <span
style="color:rosybrown">1000</span><o:p></o:p></span>
<p class="MsoNormal"><span
style="font-size:10.5pt;font-family:"Monospaced","serif";color:#A020F0"
lang="EN-US">for</span><span
style="font-size:10.5pt;font-family:"Monospaced","serif""
lang="EN-US"> <span style="color:black">i</span> <span
style="color:#5C5C5C">=</span> <span style="color:rosybrown">1</span>
<span style="color:#FFAA00">:</span> <span style="color:black">n</span><o:p></o:p></span></p>
<p class="MsoNormal"><span
style="font-size:10.5pt;font-family:"Monospaced","serif""
lang="EN-US"> <span style="color:#A020F0">for</span> <span
style="color:black">j</span> <span style="color:#5C5C5C">=</span>
<span style="color:rosybrown">1</span> <span
style="color:#FFAA00">:</span> <span style="color:black">n</span><o:p></o:p></span></p>
<p class="MsoNormal"><span
style="font-size:10.5pt;font-family:"Monospaced","serif""
lang="EN-US"> <span style="color:black">Good</span><span
style="color:#4A55DB">(</span><span style="color:black">i,j</span><span
style="color:#4A55DB">)</span> <span style="color:#5C5C5C">=</span>
<span style="color:black">i</span><span style="color:#5C5C5C">*</span><span
style="color:black">j;</span><o:p></o:p></span></p>
<p class="MsoNormal"><span
style="font-size:10.5pt;font-family:"Monospaced","serif""
lang="EN-US"> <span style="color:#A020F0">end</span><o:p></o:p></span></p>
<span
style="font-size:10.5pt;font-family:"Monospaced","serif";color:#A020F0"
lang="EN-US">end</span><br>
good=toc()<br>
<br>
bad/good<br>
<br>
//(in my PC this is already 3x faster)<br>
<br>
tic<br>
best=(1:n)'*(1:n);<br>
best=toc()<br>
<br>
bad/best<br>
</body>
</html>