<html>
<head>
<meta content="text/html; charset=windows-1252"
http-equiv="Content-Type">
</head>
<body text="#000000" bgcolor="#FFFFFF">
<div class="moz-cite-prefix">Bonjour,<br>
<br>
Le 20/06/2016 16:29, Pascal Boulet a écrit :<br>
</div>
<blockquote
cite="mid:0DADA45A-1E93-4D36-B587-55D9D627A9DC@univ-amu.fr"
type="cite">
<meta http-equiv="Content-Type" content="text/html;
charset=windows-1252">
Bonjour,
<div><br>
</div>
<div>Je travaille avec des atomes (dans une molécule) auxquels je
veux appliquer une matrice de transformation 3x3. Les atomes
sont repérés par des coordonnées x, y et z. En fait j’ai une
liste de ’nat' atomes. Actuellement, pour appliquer la matrice à
chacun des atomes je fais une boucle sur les atomes, tel que:</div>
<div><br>
</div>
<div>
<pre style="font-family: Monospaced; font-size: 12px;"><span style="color:rgb(160,32,240);">for</span> i<span style="color:rgb(92,92,92);">=</span><span style="color:rgb(188,143,143);">1</span><span style="color:rgb(255,170,0);">:</span>nat
pos<span style="color:rgb(74,85,219);">(</span><span style="color:rgb(255,170,0);">:</span><span style="color:rgb(74,85,219);">)</span><span style="color:rgb(92,92,92);">=</span>x<span style="color:rgb(74,85,219);">(</span>i,<span style="color:rgb(255,170,0);">:</span><span style="color:rgb(74,85,219);">)</span>
frac<span style="color:rgb(92,92,92);">=</span>M<span style="color:rgb(92,92,92);">*</span>pos<span style="color:rgb(92,92,92);">'</span>
mfprintf<span style="color:rgb(74,85,219);">(</span>fd,<span style="color:rgb(188,143,143);">'</span><span style="color:rgb(188,143,143);">%3s %10.5f %10.5f %10.5f\n</span><span style="color:rgb(188,143,143);">'</span>,lab<span style="color:rgb(74,85,219);">(</span>i<span style="color:rgb(74,85,219);">)</span>,frac<span style="color:rgb(74,85,219);">(</span><span style="color:rgb(188,143,143);">1</span><span style="color:rgb(74,85,219);">)</span>,frac<span style="color:rgb(74,85,219);">(</span><span style="color:rgb(188,143,143);">2</span><span style="color:rgb(74,85,219);">)</span>,frac<span style="color:rgb(74,85,219);">(</span><span style="color:rgb(188,143,143);">3</span><span style="color:rgb(74,85,219);">)</span><span style="color:rgb(74,85,219);">)</span>
<span style="color:rgb(160,32,240);">end</span></pre>
<div>Les positions de tous les atomes sont contenues dans la
matrice x(1:nat,1:3). Dans la boucle chaque position est
stockée dans pos(1:3) puis multipliée par la matrice de
transformation M. Ensuite j’écris le résultat dans un fichier.</div>
</div>
<div><br>
</div>
<div>Je voudrais simplement savoir s’il y a une méthode plus
efficace qui permettrait de s’affranchir de la boucle sur le
nombre d’atomes et pour bénéficier de la vectorisation de
Scilab.</div>
</blockquote>
.<br>
Oui, il suffit de transposer votre matrice x avant de multiplier M
par elle:<br>
newX = M*x.' // où x(:,i) désignent les coordonnées initiales de
l'atome n°i, et newX(:,i) ses coordonnées finales.<br>
<br>
rotate3d() utilise cette méthode pour donner les coordonnées après
une rotation en 3D :<br>
<a class="moz-txt-link-freetext" href="https://fileexchange.scilab.org/toolboxes/369000">https://fileexchange.scilab.org/toolboxes/369000</a><br>
<br>
Bonne continuation<br>
Samuel<br>
<br>
</body>
</html>