<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-9095652577974359156</id><updated>2024-10-06T21:06:59.083-07:00</updated><category term="math engine"/><category term="FFT"/><category term="operaciones SSE"/><category term="operaciones matriz-matriz"/><category term="operaciones matriz-vector"/><category term="operaciones vector-matriz"/><category term="operaciones vector-vector"/><category term="average"/><category term="derivación"/><category term="distance SSE"/><category term="distancia de vectores"/><category term="estadistica"/><category term="factorizaciones"/><category term="improvement SSE"/><category term="integración"/><category term="libreria matematica"/><category term="matematicas"/><category term="matrices"/><category term="max"/><category term="mejora de rendimiento"/><category term="min"/><category term="modulo"/><category term="motor de matematicas"/><category term="normalización"/><category term="operaciones vector-escalar"/><category term="producto escalar"/><category term="series de datos"/><category term="sobrecarga de operadores"/><category term="tratamiento de funciones"/><category term="vector distance"/><category term="vectores SSE"/><category term="vectores de tamaño variable"/><title type='text'>Math Engine</title><subtitle type='html'>Blog spin-off de http://lordpakus.blogspot.com/ donde nos centraremos en la creación y uso de un math engine (motor de cálculo) basado en la paralelización multicore mediante threads y las instrucciones de ensamblador SSE. Los primeros articulos al menos serán reposteos del blog original, espero que os guste.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://mathengine.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9095652577974359156/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://mathengine.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>LordPakus</name><uri>http://www.blogger.com/profile/10396031062672881371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>7</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-9095652577974359156.post-267454695703827877</id><published>2011-09-08T10:23:00.000-07:00</published><updated>2011-09-08T10:23:23.164-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="distance SSE"/><category scheme="http://www.blogger.com/atom/ns#" term="distancia de vectores"/><category scheme="http://www.blogger.com/atom/ns#" term="improvement SSE"/><category scheme="http://www.blogger.com/atom/ns#" term="mejora de rendimiento"/><category scheme="http://www.blogger.com/atom/ns#" term="operaciones SSE"/><category scheme="http://www.blogger.com/atom/ns#" term="vector distance"/><title type='text'>Math Engine : Capitulo 6. Vector.distance con SSE (x10 al rendimiento)</title><content type='html'>El artículo original lo podeís encontrar &lt;b style=&quot;color: red;&quot;&gt;&lt;a href=&quot;http://lordpakus.blogspot.com/2011/09/math-engine-capitulo-6-vectordistance.html&quot;&gt;aquí&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Computacionalmente hablando cuanto más compleja es la operación más mejora de rendimiento se puede llegar a conseguir.&lt;br /&gt;
&lt;br /&gt;
Pues  bien, concretamente para la optimización SSE, para el caso de la  distancia entre dos vectores (algo más complejo que una simple suma de vectores) se ha conseguido unos valores de tiempo de :&lt;br /&gt;
Version sin optimizar&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Tiempo gastado: 680milisegundos&lt;br /&gt;
Version optimizada con SSE&amp;nbsp;&amp;nbsp; Tiempo gastado: 68milisegundos&lt;br /&gt;
&lt;br /&gt;
Es decir se ha CONSEGUIDO MULTIPLICAR POR 10 EL RENDIMIENTO!!!.&lt;br /&gt;
&lt;br /&gt;
Aqui os dejo el código para que veais&amp;nbsp; como lo he hecho:&lt;br /&gt;
&lt;br /&gt;
float LPVector::distanceOld(LPVector vector)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; float a = 0.0;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; float temp = 0.0;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; //Si las dimensiones son diferentes , tenemos un problema grave.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if (n != vector.n)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; &quot;ERROR DIMENSIONAL ENTRE VECTORES\n&quot;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return (-1.0);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; for(int i = 0 ; i &amp;lt; n ; ++i)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; temp = (v[i] - vector.v[i]);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; a += ( temp * temp ) ;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return sqrt(a);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float LPVector::distanceSSE(LPVector vector)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; //Fast SSE code when float specified&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; float b[4];&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; float* const row0 = (float*) &amp;amp;v[0];&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; float* const row1 = (float*) &amp;amp;(vector.v[0]);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; float* const a&amp;nbsp;&amp;nbsp;&amp;nbsp; = (float*) &amp;amp;b[0];&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; float temp = 0.0;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int i = 0;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; //Si las dimensiones son diferentes , tenemos un problema grave.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if (n != vector.n)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; &quot;ERROR DIMENSIONAL ENTRE VECTORES\n&quot;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return (-1.0);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; __asm &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; // Carga trozos de los vectores de 4 en 4 &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; // La carga se hace &quot;desordenada para que siempre haya una instrucción como mínimo entre uso y uso de registros.&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; mov&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; edx, row0&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; mov&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; esi, row1&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; mov&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;edi, a&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //Al hacer una XOR ponemos el registro a 0 más rapidamente que hacciendo un mov de 0&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //El registro xmm7 (el último) lo ponemos de variable acumuladora de resultado&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; xorps&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; xmm7, xmm7&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; i = n;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; while( i &amp;gt;= 12 )&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; __asm&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //Cargamos la info en los registros SSE&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; movups&amp;nbsp;&amp;nbsp; xmm0, [edx]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; movups&amp;nbsp;&amp;nbsp; xmm1, [esi]&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //Aumentamos los contadores en 16 = 4 elementos * 4 bytes por elemento (float)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; add&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;edx,16&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; add&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;esi,16&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //Cargamos la info en los registros SSE(tenemos 8 registros donde guardar info)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; movups&amp;nbsp;&amp;nbsp; xmm2, [edx]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; movups&amp;nbsp;&amp;nbsp; xmm3, [esi]&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //Aumentamos los contadores en 16 = 4 elementos * 4 bytes por elemento (float)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; add&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;edx,16&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; add&amp;nbsp; esi,16&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //Cargamos la info en los registros SSE(tenemos 8 registros donde guardar info)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; movups&amp;nbsp;&amp;nbsp; xmm4, [edx]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; movups&amp;nbsp;&amp;nbsp; xmm5, [esi]&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //Aumentamos los contadores en 16 = 4 elementos * 4 bytes por elemento (float)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; add&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;edx,16&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; add&amp;nbsp; esi,16&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //Hacemos la operación que toca, en nuestro caso, restar , elevar el resultado al cuadrado y acumular el resultado&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; subps&amp;nbsp;&amp;nbsp;&amp;nbsp; xmm0 , xmm1&amp;nbsp;&amp;nbsp;&amp;nbsp; //Restamos de 4 en 4&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; subps&amp;nbsp;&amp;nbsp;&amp;nbsp; xmm2 , xmm3&amp;nbsp;&amp;nbsp;&amp;nbsp; //Restamos de 4 en 4&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; subps&amp;nbsp;&amp;nbsp;&amp;nbsp; xmm4 , xmm5&amp;nbsp;&amp;nbsp;&amp;nbsp; //Restamos de 4 en 4&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //Elevamos al cuadrado la diferencia&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; mulps&amp;nbsp;&amp;nbsp;&amp;nbsp; xmm0,xmm0&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; mulps&amp;nbsp;&amp;nbsp; xmm2,xmm2&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; mulps&amp;nbsp;&amp;nbsp;&amp;nbsp; xmm4,xmm4&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //Sumamos resultados parciales al total (xmm7)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; addps&amp;nbsp;&amp;nbsp;&amp;nbsp; xmm7,xmm0&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; addps&amp;nbsp;&amp;nbsp;&amp;nbsp; xmm7,xmm2&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; addps&amp;nbsp;&amp;nbsp;&amp;nbsp; xmm7,xmm4&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; i -= 12;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; __asm&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; movups&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;[edi], xmm7&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; b[0] += (b[1] + b[2] + b[3]); &lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; //Los flecos los rematamos de la manera tradicional&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; for(int j = n-i ; j &amp;lt; n ; ++j)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; temp = (v[i] - vector.v[i]);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; b[0] += temp*temp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return sqrt(b[0]);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main (int argc, char* argv[]) &lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; LPVector v1,v2;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; float d1,d2;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; clock_t timer;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; float delay;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; //Creamos los vectores aleatorios&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; v1.random(DIM,0.0f,100.0f);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; v2.random(DIM,0.0f,100.0f);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; //Sumamos los vectores&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; &quot;Version sin optimizar\n&quot;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; timer = clock();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; for(int i=0 ; i &amp;lt; 100000 ; i++ )&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; d1 = v1.distanceOld ( v2 );&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; delay = ( clock() - timer ) ;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; &quot;Tiempo gastado: &quot; &amp;lt;&amp;lt; delay &amp;lt;&amp;lt; &quot;milisegundos\n&quot;;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; &quot;Version optimizada con SSE\n&quot;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; timer = clock();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; for(int i=0 ; i &amp;lt; 100000 ; i++ )&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; d2 = v1.distanceSSE ( v2 );&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; delay = ( clock() - timer ) ;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; &quot;Tiempo gastado: &quot; &amp;lt;&amp;lt; delay &amp;lt;&amp;lt; &quot;milisegundos\n&quot;;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if ( d1 != d2)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; &quot;Error: La operacion da diferente resultado!!!\n&quot;;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if ( d1 == d2)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; &quot;Calculo correcto\n&quot;;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; //Eliminamos los vectores&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; v1.Delete();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; v2.Delete();&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; system(&quot;PAUSE&quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Si  hay algo que no entendais o quereis que implemente en SSE alguna  función en especial no dudeis en hacerme llegar vuestras sugerencias o  preocupaciones...&lt;br /&gt;
&lt;br /&gt;
Espero que os haya gustado y que hayais aprendido...&lt;br /&gt;
&lt;br /&gt;
Nos vemos</content><link rel='replies' type='application/atom+xml' href='http://mathengine.blogspot.com/feeds/267454695703827877/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://mathengine.blogspot.com/2011/09/math-engine-capitulo-6-vectordistance.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9095652577974359156/posts/default/267454695703827877'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9095652577974359156/posts/default/267454695703827877'/><link rel='alternate' type='text/html' href='http://mathengine.blogspot.com/2011/09/math-engine-capitulo-6-vectordistance.html' title='Math Engine : Capitulo 6. Vector.distance con SSE (x10 al rendimiento)'/><author><name>LordPakus</name><uri>http://www.blogger.com/profile/10396031062672881371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9095652577974359156.post-3810689946068756416</id><published>2011-09-08T10:19:00.001-07:00</published><updated>2011-09-08T10:19:58.701-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="operaciones SSE"/><category scheme="http://www.blogger.com/atom/ns#" term="vectores SSE"/><title type='text'>Math Engine : Capitulo 5. LPVector con SSE(I).</title><content type='html'>El artículo original lo podeís encontrar&lt;b style=&quot;color: red;&quot;&gt; &lt;a href=&quot;http://lordpakus.blogspot.com/2011/09/math-engine-capitulo-5-lpvector-con.html&quot;&gt;aquí&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Hola a todos....&lt;br /&gt;
&lt;br /&gt;
Aquí os dejo la implementación de la suma de vectores mediante SSE.&lt;br /&gt;
&lt;br /&gt;
int main (int argc, char* argv[]) &lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; LPVector v1,v2,v3;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; clock_t timer;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; float delay;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; //Creamos los vectores aleatorios&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; v1.random(DIM,0.0f,500.0f);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; v2.random(DIM,0.0f,500.0f);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; v3 = v1;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; //Sumamos los vectores&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; &quot;Version sin optimizar\n&quot;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; timer = clock();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; v1.addOld ( v2 );&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; delay = ( clock() - timer ) ;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; &quot;Tiempo gastado: &quot; &amp;lt;&amp;lt; delay &amp;lt;&amp;lt; &quot;milisegundos\n&quot;;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; &quot;Version optimizada con SSE\n&quot;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; timer = clock();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; v3.addSSE ( v2 );&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; delay = ( clock() - timer ) ;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; &quot;Tiempo gastado: &quot; &amp;lt;&amp;lt; delay &amp;lt;&amp;lt; &quot;milisegundos\n&quot;;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if ( v1 != v3)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; &quot;Error: La operacion da diferente resultado!!!\n&quot;;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if ( v1 == v3)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; &quot;Calculo correcto\n&quot;;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; //Eliminamos los vectores&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; v1.Delete();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; v2.Delete();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; v3.Delete();&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; system(&quot;PAUSE&quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void LPVector::addOld(LPVector vector)&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //Operación de += modo antiguo (solo C)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; //Si las dimensiones son diferentes , tenemos un problema grave.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if (n != vector.n)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; &quot;ERROR DIMENSIONAL ENTRE VECTORES\n&quot;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; for(int i = 0 ; i &amp;lt; n ; ++i)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; v[i] += vector.v[i];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void LPVector::addSSE(LPVector vector)&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //Operación de += modo ensamblador SSE &lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; //Fast SSE code when float specified&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; float* const row0 = (float*) &amp;amp;v[0];&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; float* const row1 = (float*) &amp;amp;(vector.v[0]);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int i = 0;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; //Si las dimensiones son diferentes , tenemos un problema grave.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if (n != vector.n)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; &quot;ERROR DIMENSIONAL ENTRE VECTORES\n&quot;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; __asm &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; // Carga trozos de los vectores de 4 en 4 &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; // La carga se hace &quot;desordenada para que siempre haya una instrucción como mínimo entre uso y uso de registros.&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; mov&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; edx, row0&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; mov&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; esi, row1&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; i = n;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; while( i &amp;gt;= 8 )&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; __asm&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //Copiamos el puntero al vector v donde almacenaremos el valor final&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; mov&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; edi,&amp;nbsp;&amp;nbsp;&amp;nbsp; edx&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //Cargamos la info en los registros SSE&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; movups&amp;nbsp;&amp;nbsp; xmm0, [edx]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; movups&amp;nbsp;&amp;nbsp; xmm1, [esi]&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //Aumentamos los contadores en 16 = 4 elementos * 4 bytes por elemento (float)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; add&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;edx,16&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; add&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;esi,16&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //Cargamos la info en los registros SSE(tenemos 8 registros donde guardar info)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; movups&amp;nbsp;&amp;nbsp; xmm2, [edx]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; movups&amp;nbsp;&amp;nbsp; xmm3, [esi]&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //Hacemos la operación que toca, en nuestro caso, sumar&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; addps&amp;nbsp;&amp;nbsp;&amp;nbsp; xmm0 , xmm1&amp;nbsp;&amp;nbsp;&amp;nbsp; //Sumamos de 4 en 4&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; addps&amp;nbsp;&amp;nbsp;&amp;nbsp; xmm2 , xmm3&amp;nbsp;&amp;nbsp;&amp;nbsp; //Sumamos de 4 en 4&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //En edi y edx es donde teniamos cargado los trozo de vector v y es donde pondremos el resultado&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; movups&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;[edi], xmm0&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; movups&amp;nbsp;&amp;nbsp; [edx], xmm2&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //Aumentamos los contadores en 16 = 4 elementos * 4 bytes por elemento (float)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; add&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;edx,16&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; add&amp;nbsp; esi,16&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; i -= 8;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; //Los flecos los rematamos de la manera tradicional&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; for(int j = n-i ; j &amp;lt; n ; ++j)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; v[j] += vector.v[j];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Al ejecutar todo este código tendreis una salida de este estilo:&lt;br /&gt;
Version sin optimizar&lt;br /&gt;
Tiempo gastado: 321 milisegundos&lt;br /&gt;
Version optimizada con SSE&lt;br /&gt;
Tiempo gastado : 240 milisegundos&lt;br /&gt;
Calculo correcto.&lt;br /&gt;
&lt;br /&gt;
Podreis  observar que la ganancia no es comparable a multiplicar por 4 la  velocidad como predicen las operaciones SSE sino que se queda en un  25-30% de mejora. Esto es debido a que las operaciones de entrada-salida  (movups) gastan muchos recursos y hacen que las operaciones sencillas (  por ejemplo un suma sencilla ) se vean menos mejoradas que las  operaciones complicadas ( muchos cálculos y pocos accesos a memoria ).&lt;br /&gt;
&lt;br /&gt;
Espero que os guste, nos vemos</content><link rel='replies' type='application/atom+xml' href='http://mathengine.blogspot.com/feeds/3810689946068756416/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://mathengine.blogspot.com/2011/09/math-engine-capitulo-5-lpvector-con.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9095652577974359156/posts/default/3810689946068756416'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9095652577974359156/posts/default/3810689946068756416'/><link rel='alternate' type='text/html' href='http://mathengine.blogspot.com/2011/09/math-engine-capitulo-5-lpvector-con.html' title='Math Engine : Capitulo 5. LPVector con SSE(I).'/><author><name>LordPakus</name><uri>http://www.blogger.com/profile/10396031062672881371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9095652577974359156.post-6945977899887889571</id><published>2011-09-08T10:18:00.000-07:00</published><updated>2011-09-08T10:18:28.327-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="average"/><category scheme="http://www.blogger.com/atom/ns#" term="estadistica"/><category scheme="http://www.blogger.com/atom/ns#" term="FFT"/><category scheme="http://www.blogger.com/atom/ns#" term="max"/><category scheme="http://www.blogger.com/atom/ns#" term="min"/><category scheme="http://www.blogger.com/atom/ns#" term="series de datos"/><title type='text'>Math Engine : Capitulo 4. Clase LPData</title><content type='html'>El artículo original lo podeís encontrar &lt;b style=&quot;color: red;&quot;&gt;&lt;a href=&quot;http://lordpakus.blogspot.com/2011/08/math-engine-capitulo-4-clase-lpdata.html&quot;&gt;aquí&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bienvenidos a un nuevo capitulo de  como crear tu propio math engine. El capitulo de hoy es la presentación  del tercer (y si no estoy equivocado, último) tipo de dato que se usará  en el math engine: el LPData es decir, series de datos. Con series de  datos se representarán tanto muestreo de señales (con lo que se podrán  realizar FFT&amp;nbsp; y otras transformaciones, de audio sobretodo) como series  de datos estadísticos o muestreo de funciones. (maximos, mínimos,  medias, rectas de regresión, integración, derivación,etc....)&lt;br /&gt;
&lt;br /&gt;
Por  ahora solo os pongo la estructura, que funciones se irán implementando  lo dejo para vosotros para que me lo vayais diciendo a medida que las  vayais necesitando.&lt;br /&gt;
&lt;br /&gt;
LPData.h:&lt;br /&gt;
/**************************************************************************************************/&lt;br /&gt;
//&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Código creado por F.Bordas (LordPakus) como ejemplo de creación de un math engine&lt;br /&gt;
//&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; para el blog LordPakus (http://lordpakus.blogspot.com/). &lt;br /&gt;
//&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Prohibida la distribución fuera de este blog sin el permiso expreso del autor&lt;br /&gt;
/**************************************************************************************************/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**************************************************************************************************/&lt;br /&gt;
// LPData.h &lt;br /&gt;
/**************************************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#ifndef __LPData__&lt;br /&gt;
#define __LPData__&lt;br /&gt;
&lt;br /&gt;
class LPData&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; LPData();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; ~LPData();&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; //Funciones anexas.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; void Set(int t, float* vector);&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //Funcion para inicializar un vector de n elementos&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; void Delete();&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //Función para limpiar la variable vector&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; void print();&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //Función para imprimir el vector por la consola&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; void random(int t,float min, float max);&amp;nbsp;&amp;nbsp;&amp;nbsp; //Función para rellenar de random un vector de t posiciones&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; float Max();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; float Min();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; float Average();&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; //OPERACIONES DE AMULACIÓN DE RESULTADO (+=,-=,etc...), devuelven void como norma general&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; //Operaciones vectoriales&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; void operator +=(LPData vector);&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; void operator -=(LPData vector);&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; //Operaciones con escalares ( sumar , restar , etc ... todo un vector por un escalar)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; void operator +=(float scal);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; void operator -=(float scal);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; void operator *=(float scal);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; void operator /=(float scal);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; //OPERACIONES QUE DEVUELVEN ALGO (NO ACUMULADORES: +,-,*, etc...)&lt;br /&gt;
&lt;br /&gt;
public:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int n;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;//número de elementos del vector&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; float *v;&amp;nbsp;&amp;nbsp;&amp;nbsp; //puntero a memoria dinámica&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
LPData.cpp:&lt;br /&gt;
/**************************************************************************************************/&lt;br /&gt;
//&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Código creado por F.Bordas (LordPakus) como ejemplo de creación de un math engine&lt;br /&gt;
//&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; para el blog LordPakus (http://lordpakus.blogspot.com/). &lt;br /&gt;
//&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Prohibida la distribución fuera de este blog sin el permiso expreso del autor&lt;br /&gt;
/**************************************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#include &quot;LPData.h&quot;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //Usada para imprimir por consola&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
//Constructor&lt;br /&gt;
LPData::LPData()&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; n = 0;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; v = NULL;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Destructor&lt;br /&gt;
LPData::~LPData()&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; //if (n)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; //{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; //&amp;nbsp;&amp;nbsp;&amp;nbsp; if( v != NULL )&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; //&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; free(v);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; //}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Funcion para inicializar una serie de datos de n elementos&lt;br /&gt;
void LPData::Set(int t, float* vector) &lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; n = t; //Inicializamos el número de elementos del vector&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; //Creamos un vector de memoria dinámica.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; v = (float*) malloc( sizeof(float) * n );&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; //Copiamos el vector externo en el vector interno&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; memcpy(v,vector,sizeof(float) * n );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Función para limpiar la variable vector&lt;br /&gt;
void LPData::Delete()&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; n=0;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; free(v);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Imprimimos el valor del vector&lt;br /&gt;
void LPData::print()&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; for(int i = 0 ; i &amp;lt; n ; ++i)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; (float) v[i] &amp;lt;&amp;lt; &quot; &quot;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void LPData::random(int t, float min, float max)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; n = t; //Inicializamos el número de elementos del vector&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; //Creamos un vector de memoria dinámica.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; v = (float*) malloc( sizeof(float) * n );&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; for(int i = 0 ; i &amp;lt; n ; ++i)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; v[i] = (float)(rand()%(int)(max*1000 - min*1000))/1000 + min;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float LPData::Max()&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; float max;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; max = v[0];&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; for(int i = 1 ; i &amp;lt; n ; ++i)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if( v[i] &amp;gt; max )&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; max = v[i];&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return max;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float LPData::Min()&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; float min;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; min = v[0];&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; for(int i = 1 ; i &amp;lt; n ; ++i)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if( v[i] &amp;lt; min )&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; min = v[i];&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return min;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float LPData::Average()&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; float ave = 0;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; for(int i = 0 ; i &amp;lt; n ; ++i)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ave += v[i];&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; ave /= n;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return ave;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Sobrecarga operador +=&lt;br /&gt;
void LPData::operator +=(LPData vector)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; //Si las dimensiones son diferentes , tenemos un problema grave.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if (n != vector.n)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; &quot;ERROR DIMENSIONAL ENTRE SERIES DE DATOS\n&quot;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; for(int i = 0 ; i &amp;lt; n ; ++i)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; v[i] += vector.v[i];&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Sobrecarga operador -=&lt;br /&gt;
void LPData::operator -=(LPData vector)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; //Si las dimensiones son diferentes , tenemos un problema grave.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if (n != vector.n)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; &quot;ERROR DIMENSIONAL ENTRE SERIES DE DATOS\n&quot;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; for(int i = 0 ; i &amp;lt; n ; ++i)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; v[i] -= vector.v[i];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Sobrecarga operador +=&lt;br /&gt;
void LPData::operator +=(float scal)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; for(int i = 0 ; i &amp;lt; n ; ++i)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; v[i] += scal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Sobrecarga operador -=&lt;br /&gt;
void LPData::operator -=(float scal)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; for(int i = 0 ; i &amp;lt; n ; ++i)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; v[i] -= scal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Sobrecarga operador *=&lt;br /&gt;
void LPData::operator *=(float scal)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; for(int i = 0 ; i &amp;lt; n ; ++i)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; v[i] *= scal;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Sobrecarga operador /=&lt;br /&gt;
void LPData::operator /=(float scal)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; for(int i = 0 ; i &amp;lt; n ; ++i)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; v[i] /= scal;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Salvo  fallo de planificación a partir de ahora solo es ir &quot;rellenando&quot; la  estructura que tenemos con nuevas funcionalidades e implementaciones más  eficientes.&lt;br /&gt;
&lt;br /&gt;
Espero que os haya gustado,&lt;br /&gt;
&lt;br /&gt;
Nos vemos</content><link rel='replies' type='application/atom+xml' href='http://mathengine.blogspot.com/feeds/6945977899887889571/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://mathengine.blogspot.com/2011/09/math-engine-capitulo-4-clase-lpdata.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9095652577974359156/posts/default/6945977899887889571'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9095652577974359156/posts/default/6945977899887889571'/><link rel='alternate' type='text/html' href='http://mathengine.blogspot.com/2011/09/math-engine-capitulo-4-clase-lpdata.html' title='Math Engine : Capitulo 4. Clase LPData'/><author><name>LordPakus</name><uri>http://www.blogger.com/profile/10396031062672881371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9095652577974359156.post-2962000775537817939</id><published>2011-09-08T10:17:00.000-07:00</published><updated>2011-09-08T10:17:01.186-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="factorizaciones"/><category scheme="http://www.blogger.com/atom/ns#" term="math engine"/><category scheme="http://www.blogger.com/atom/ns#" term="matrices"/><category scheme="http://www.blogger.com/atom/ns#" term="operaciones matriz-matriz"/><category scheme="http://www.blogger.com/atom/ns#" term="operaciones matriz-vector"/><category scheme="http://www.blogger.com/atom/ns#" term="operaciones vector-matriz"/><title type='text'>Math Engine : Capitulo 3. Clase LPMatrix</title><content type='html'>El artículo original lo podeís encontrar &lt;b style=&quot;color: red;&quot;&gt;&lt;a href=&quot;http://lordpakus.blogspot.com/2011/08/math-engine-capitulo-3-clase-lpmatrix.html&quot;&gt;aquí&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bienvenidos a un nuevo capitulo de  como crear un math engine. El capitulo de hoy se encargará de mostrar el  tipo de variable que seguramente más se usará en las aplicaciones de  cálculo, las matrices.&lt;br /&gt;
&lt;br /&gt;
Dado que es totalmente imposible  poner todas las funciones que afectan a matrices (solamente con  factorizaciones podria llenar miles de lineas de código) este capitulo  lo dejaré totalmente abierto (como el del LPVector) para que me vayais  proponiendo las funciones que querais que introduzcamos en este módulo.&lt;br /&gt;
&lt;br /&gt;
No obstante, si quereis ir probando código aquí os dejo lo que he implementado hasta el momento:&lt;br /&gt;
LPMatrix.h:&lt;br /&gt;
/**************************************************************************************************/&lt;br /&gt;
//&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Código creado por F.Bordas (LordPakus) como ejemplo de creación de un math engine&lt;br /&gt;
//&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; para el blog LordPakus (http://lordpakus.blogspot.com/). &lt;br /&gt;
//&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Prohibida la distribución fuera de este blog sin el permiso expreso del autor&lt;br /&gt;
/**************************************************************************************************/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**************************************************************************************************/&lt;br /&gt;
// LPMatrix.h &lt;br /&gt;
/**************************************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#ifndef __LPMatrix__&lt;br /&gt;
#define __LPMatrix__&lt;br /&gt;
&lt;br /&gt;
class LPMatrix&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; LPMatrix();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; ~LPMatrix();&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; //Funciones anexas.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; void Set(int t, int k, float* vector); //Funcion para inicializar una matriz de t*k elementos&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; void Delete();&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //Función para limpiar la variable matriz&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; void print();&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //Función para imprimir la matriz por la consola&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; //OPERACIONES DE ACUMULACIÓN DE RESULTADO (+=,-=,etc...), devuelven void como norma general&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; //Operaciones vectoriales&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; void operator +=(LPMatrix matrix);&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; void operator -=(LPMatrix matrix);&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; //Operaciones con escalares ( sumar , restar , etc ... todo una matriz por un escalar)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; void operator +=(float scal);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; void operator -=(float scal);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; void operator *=(float scal);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; void operator /=(float scal);&lt;br /&gt;
&lt;br /&gt;
public:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int m,n;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; //dimensiones de la matriz&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; float **p;&amp;nbsp;&amp;nbsp;&amp;nbsp; //puntero a memoria dinámica para matrices&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
LPMatrix.cpp:&lt;br /&gt;
/**************************************************************************************************/&lt;br /&gt;
//&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Código creado por F.Bordas (LordPakus) como ejemplo de creación de un math engine&lt;br /&gt;
//&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; para el blog LordPakus (http://lordpakus.blogspot.com/). &lt;br /&gt;
//&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Prohibida la distribución fuera de este blog sin el permiso expreso del autor&lt;br /&gt;
/**************************************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#include &quot;LPMatrix.h&quot;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //Usada para imprimir por consola&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
//Constructor&lt;br /&gt;
LPMatrix::LPMatrix()&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; n = 0;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; m = 0;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; p = NULL;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Destructor&lt;br /&gt;
LPMatrix::~LPMatrix()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Funciones anexas.&lt;br /&gt;
void LPMatrix::Set(int t, int k, float* vector) //Funcion para inicializar una matriz de t*k elementos&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; //Inicializamos el número de elementos del vector&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; n = t; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; m = k;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; //Creamos un vector de memoria dinámica donde almacenaremos los punteros subsiguientes.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; p = (float**) malloc( sizeof(float *) * n );&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; //Creamos cada una de las filas o columnas (como queramos verlo) de la matriz&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; for(int i = 0 ; i &amp;lt; n ; ++i )&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; p[i] = (float*) malloc( sizeof(float) * m );&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; //Copiamos el vector externo en el vector interno&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; for(int i = 0 ; i &amp;lt; n*m ; ++i )&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; p[i/m][i%m] = vector[i];&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void LPMatrix::Delete()&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //Función para limpiar la variable matriz&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; for(int i = 0 ; i &amp;lt; n ; ++i )&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; free(p[i]);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; n=0;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; m=0;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; free(p);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void LPMatrix::print()&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //Función para imprimir la matriz por la consola&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; for(int i = 0 ; i &amp;lt; n*m ; ++i)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if(!(i%m))&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; &quot;\n&quot;;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; (float) p[i/m][i%m] &amp;lt;&amp;lt; &quot; &quot;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//OPERACIONES DE ACUMULACIÓN DE RESULTADO (+=,-=,etc...), devuelven void como norma general&lt;br /&gt;
//Operaciones vectoriales&lt;br /&gt;
void LPMatrix::operator +=(LPMatrix matrix)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; //Si las dimensiones son diferentes , tenemos un problema grave.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if ( (n != matrix.n) || (m != matrix.m) )&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; &quot;ERROR DIMENSIONAL ENTRE MATRICES\n&quot;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; for(int i = 0 ; i &amp;lt; n ; ++i)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; for(int j = 0 ; j &amp;lt; m ; ++j)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; p[i][j] += matrix.p[i][j];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void LPMatrix::operator -=(LPMatrix matrix)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; //Si las dimensiones son diferentes , tenemos un problema grave.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if ( (n != matrix.n) || (m != matrix.m) )&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; &quot;ERROR DIMENSIONAL ENTRE MATRICES\n&quot;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; for(int i = 0 ; i &amp;lt; n ; ++i)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; for(int j = 0 ; j &amp;lt; m ; ++j)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; p[i][j] -= matrix.p[i][j];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
//Operaciones con escalares ( sumar , restar , etc ... todo una matriz por un escalar)&lt;br /&gt;
void LPMatrix::operator +=(float scal)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; for(int i = 0 ; i &amp;lt; n ; ++i)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; for(int j = 0 ; j &amp;lt; m ; ++j)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; p[i][j] += scal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void LPMatrix::operator -=(float scal)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; for(int i = 0 ; i &amp;lt; n ; ++i)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; for(int j = 0 ; j &amp;lt; m ; ++j)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; p[i][j] -= scal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void LPMatrix::operator *=(float scal)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; for(int i = 0 ; i &amp;lt; n ; ++i)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; for(int j = 0 ; j &amp;lt; m ; ++j)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; p[i][j] *= scal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void LPMatrix::operator /=(float scal)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; for(int i = 0 ; i &amp;lt; n ; ++i)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; for(int j = 0 ; j &amp;lt; m ; ++j)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; p[i][j] /= scal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
main.cpp&lt;br /&gt;
int main (int argc, char* argv[]) &lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; LPMatrix m1,m2;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; float mat1[15] = { 1.0f ,1.1f ,1.5f , 1.0f ,1.1f ,1.5f , 1.0f ,1.1f ,1.5f , 1.0f ,1.1f ,1.5f , 1.0f ,1.1f ,1.5f };&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; float mat2[15] = { 3.0f ,4.1f ,0.5f , 3.0f ,4.1f ,0.5f , 3.0f ,4.1f ,0.5f , 3.0f ,4.1f ,0.5f , 3.0f ,4.1f ,0.5f };&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; m1.Set(3,5,mat1);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; m2.Set(3,5,mat2);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; &quot;Matriz 1:&quot;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; m1.print();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; &quot;\n&quot;;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; &quot;Matriz 2:&quot;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; m2.print();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; &quot;\n&quot;;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; &quot;Suma de matrices:&quot;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; m2 += m1;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; m2.print();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; &quot;\n&quot;;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; //Eliminamos las matrices&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; m1.Delete();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; m2.Delete();&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; system(&quot;PAUSE&quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Espero que os haya servido y os haya gustado.&lt;br /&gt;
&lt;br /&gt;
Nos vemos</content><link rel='replies' type='application/atom+xml' href='http://mathengine.blogspot.com/feeds/2962000775537817939/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://mathengine.blogspot.com/2011/09/math-engine-capitulo-3-clase-lpmatrix.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9095652577974359156/posts/default/2962000775537817939'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9095652577974359156/posts/default/2962000775537817939'/><link rel='alternate' type='text/html' href='http://mathengine.blogspot.com/2011/09/math-engine-capitulo-3-clase-lpmatrix.html' title='Math Engine : Capitulo 3. Clase LPMatrix'/><author><name>LordPakus</name><uri>http://www.blogger.com/profile/10396031062672881371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9095652577974359156.post-3932410782264098652</id><published>2011-09-08T10:15:00.000-07:00</published><updated>2011-09-08T10:15:09.297-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="math engine"/><category scheme="http://www.blogger.com/atom/ns#" term="modulo"/><category scheme="http://www.blogger.com/atom/ns#" term="normalización"/><category scheme="http://www.blogger.com/atom/ns#" term="operaciones vector-escalar"/><category scheme="http://www.blogger.com/atom/ns#" term="operaciones vector-vector"/><category scheme="http://www.blogger.com/atom/ns#" term="producto escalar"/><category scheme="http://www.blogger.com/atom/ns#" term="vectores de tamaño variable"/><title type='text'>Math Engine : Capitulo 2. Clase LPVector</title><content type='html'>El artículo original lo podeís encontrar &lt;b&gt;&lt;a href=&quot;http://lordpakus.blogspot.com/2011/08/math-engine-capitulo-2-clase-lpvector.html&quot; style=&quot;color: red;&quot;&gt;aquí&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
El  capitulo de hoy trata sobre la clase LPVector que es la que se encarga  de almacenar un vector de cualquier tamaño y poder operar con el.&lt;br /&gt;
&lt;br /&gt;
La  lista de operaciones que he considerado imprescindibles son las  siguientes, todas las que querais que pongamos adicionales las  ponemos... a la que tengamos una lista estable de operaciones nos  dedicaremos a optimizarlas con SSE.:&lt;br /&gt;
//Funciones anexas.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; void Set(int t, float* vector); //Funcion para inicializar un vector de n elementos&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; void Delete();&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //Función para limpiar la variable vector&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; void print();&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //Función para imprimir el vector por la consola&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; //OPERACIONES DE AMULACIÓN DE RESULTADO (+=,-=,etc...), devuelven void como norma general&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; //Operaciones vectoriales&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; void operator +=(LPVector vector);&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; void operator -=(LPVector vector);&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; void sqrt_vec();&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //Calculamos la raíz cuadrada de todo los elementos del vector&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; void normalize();&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //Normaliza el vector (hace que el módulo sea 1)&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; //Operaciones con escalares ( sumar , restar , etc ... todo un vector por un escalar)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; void operator +=(float scal);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; void operator -=(float scal);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; void operator *=(float scal);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; void operator /=(float scal);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; //OPERACIONES QUE DEVUELVEN ALGO (NO ACUMULADORES: +,-,*, etc...)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; //Operaciones vectoriales que devuelven escalares&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; float operator ^(LPVector vector);&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //Operador producto escalar.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; float module();&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //Calcula el módulo del vector&lt;br /&gt;
&lt;br /&gt;
El código se organiza en dos archivos LPVector (.cpp y .h) junto con los cambios del main para demostrar que funcionan:&lt;br /&gt;
&lt;br /&gt;
main.cpp:&lt;br /&gt;
/**************************************************************************************************/&lt;br /&gt;
//&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Código creado por F.Bordas (LordPakus) como ejemplo de creación de un math engine&lt;br /&gt;
//&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; para el blog LordPakus (http://lordpakus.blogspot.com/). &lt;br /&gt;
//&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Prohibida la distribución fuera de este blog sin el permiso expreso del autor&lt;br /&gt;
/**************************************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/**************************************************************************************************/&lt;br /&gt;
// main.cpp : Main de nuestro MathEngine&lt;br /&gt;
/**************************************************************************************************/&lt;br /&gt;
&lt;br /&gt;
//Include del Math engine&lt;br /&gt;
#include &quot;LPMath.h&quot;&lt;br /&gt;
&lt;br /&gt;
//Delete console&lt;br /&gt;
//#pragma comment(linker, &quot;/subsystem:\&quot;windows\&quot; /entry:\&quot;mainCRTStartup\&quot;&quot;)&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //Usada para imprimir por consola&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
int main (int argc, char* argv[]) &lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; LPVector v1,v2;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; float vec1[4] = { 1.0f ,1.1f ,1.5f ,2.5f };&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; float vec2[4] = { 3.0f ,4.1f ,0.5f ,0.4f };&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; float n;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; //Creamos los vectores&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; v1.Set(4,vec1);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; v2.Set(4,vec2);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; &quot;Vector 1: &quot;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; v1.print();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; &quot;\n&quot;;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; &quot;Vector 2: &quot;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; v2.print();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; &quot;\n&quot;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; n = v1^v2;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; &quot;Producto escalar: &quot; &amp;lt;&amp;lt;&amp;nbsp;&amp;nbsp;&amp;nbsp; n &amp;lt;&amp;lt; &quot;\n&quot;;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; n = v1.module();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; &quot;Modulo vector 1: &quot; &amp;lt;&amp;lt;&amp;nbsp;&amp;nbsp;&amp;nbsp; n &amp;lt;&amp;lt; &quot;\n&quot;;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; n = v2.module();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; &quot;Modulo vector 2: &quot; &amp;lt;&amp;lt;&amp;nbsp;&amp;nbsp;&amp;nbsp; n &amp;lt;&amp;lt; &quot;\n&quot;;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; v1.normalize();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; n = v1.module();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; &quot;Modulo vector 1 normalizado: &quot; &amp;lt;&amp;lt;&amp;nbsp;&amp;nbsp;&amp;nbsp; n &amp;lt;&amp;lt; &quot;\n&quot;;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; v2.normalize();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; n = v2.module();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; &quot;Modulo vector 2 normalizado: &quot; &amp;lt;&amp;lt;&amp;nbsp;&amp;nbsp;&amp;nbsp; n &amp;lt;&amp;lt; &quot;\n&quot;;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; v2 += v1;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; &quot;Suma de vectores: &quot;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; v2.print();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; &quot;\n&quot;;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; n = v2.module();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; &quot;Modulo de suma de vectores: &quot; &amp;lt;&amp;lt;&amp;nbsp;&amp;nbsp;&amp;nbsp; n &amp;lt;&amp;lt; &quot;\n&quot;;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; v2.normalize();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; n = v2.module();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; &quot;Modulo de suma de vectores normalizado: &quot; &amp;lt;&amp;lt;&amp;nbsp;&amp;nbsp;&amp;nbsp; n &amp;lt;&amp;lt; &quot;\n&quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; //Eliminamos los vectores&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; v1.Delete();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; v2.Delete();&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; system(&quot;PAUSE&quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
LPVector.cpp&lt;br /&gt;
/**************************************************************************************************/&lt;br /&gt;
//&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;Código creado por F.Bordas (LordPakus) como ejemplo de creación de un math engine&lt;br /&gt;
//&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;para el blog LordPakus (http://lordpakus.blogspot.com/). &lt;br /&gt;
//&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;Prohibida la distribución fuera de este blog sin el permiso expreso del autor&lt;br /&gt;
/**************************************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#include &quot;LPVector.h&quot;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;//Usada para imprimir por consola&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
//Constructor&lt;br /&gt;
LPVector::LPVector()&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;n = 0;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;v = NULL;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Destructor&lt;br /&gt;
LPVector::~LPVector()&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;//if (n)&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;//{&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;//&amp;nbsp;&amp;nbsp; &amp;nbsp;if( v != NULL )&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;//&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;free(v);&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;//}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Funcion para inicializar un vector de n elementos&lt;br /&gt;
void LPVector::Set(int t, float* vector) &lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;n = t; //Inicializamos el número de elementos del vector&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;//Creamos un vector de memoria dinámica.&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;v = (float*) malloc( sizeof(float) * n );&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;//Copiamos el vector externo en el vector interno&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;memcpy(v,vector,sizeof(float) * n );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Función para limpiar la variable vector&lt;br /&gt;
void LPVector::Delete()&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;n=0;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;free(v);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Imprimimos el valor del vector&lt;br /&gt;
void LPVector::print()&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;for(int i = 0 ; i &amp;lt; n ; ++i)&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;cout &amp;lt;&amp;lt; (float) v[i] &amp;lt;&amp;lt; &quot; &quot;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void LPVector::random(int t, float min, float max)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;n = t; //Inicializamos el número de elementos del vector&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;//Creamos un vector de memoria dinámica.&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;v = (float*) malloc( sizeof(float) * n );&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;for(int i = 0 ; i &amp;lt; n ; ++i)&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;v[i] = (float)(rand()%(int)(max*1000 - min*1000))/1000 + min;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void LPVector::cross(LPVector vector)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;//POR IMPLEMENTAR&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void LPVector::sqrt_vec()&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;for(int i = 0 ; i &amp;lt; n ; ++i)&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;v[i] = sqrt(v[i]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void LPVector::normalize()&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;//Dividimos cada componente por el módulo&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;*this /= this-&amp;gt;module();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Sobrecarga operador +=&lt;br /&gt;
void LPVector::operator +=(LPVector vector)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;//Si las dimensiones son diferentes , tenemos un problema grave.&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;if (n != vector.n)&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;cout &amp;lt;&amp;lt; &quot;ERROR DIMENSIONAL ENTRE VECTORES\n&quot;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;return;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;for(int i = 0 ; i &amp;lt; n ; ++i)&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;v[i] += vector.v[i];&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Sobrecarga operador -=&lt;br /&gt;
void LPVector::operator -=(LPVector vector)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;//Si las dimensiones son diferentes , tenemos un problema grave.&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;if (n != vector.n)&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;cout &amp;lt;&amp;lt; &quot;ERROR DIMENSIONAL ENTRE VECTORES\n&quot;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;return;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;for(int i = 0 ; i &amp;lt; n ; ++i)&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;v[i] -= vector.v[i];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Sobrecarga operador +=&lt;br /&gt;
void LPVector::operator +=(float scal)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;for(int i = 0 ; i &amp;lt; n ; ++i)&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;v[i] += scal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Sobrecarga operador -=&lt;br /&gt;
void LPVector::operator -=(float scal)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;for(int i = 0 ; i &amp;lt; n ; ++i)&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;v[i] -= scal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Sobrecarga operador *=&lt;br /&gt;
void LPVector::operator *=(float scal)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;for(int i = 0 ; i &amp;lt; n ; ++i)&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;v[i] *= scal;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Sobrecarga operador /=&lt;br /&gt;
void LPVector::operator /=(float scal)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;for(int i = 0 ; i &amp;lt; n ; ++i)&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;v[i] /= scal;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &lt;br /&gt;
}&lt;br /&gt;
//Sobrecarga  operador *= //Este operador es el que nos devolverá matrices como  resultado del producto de una columna por un fila. &lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; //Es decir, es el producto vectorial. Ya lo veremos a su momento&lt;br /&gt;
/*void LPVector::operator *=(LPVector vector)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;//Si las dimensiones son diferentes , tenemos un problema grave.&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;if (n != vector.n)&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;cout &amp;lt;&amp;lt; &quot;ERROR DIMENSIONAL ENTRE VECTORES\n&quot;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;return;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;for(int i = 0 ; i &amp;lt; n ; ++i)&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;v[i] += vector.v[i];&lt;br /&gt;
}&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
//Sobrecarga operador ^ A partir de ahora se entederá que es el producto escalar.&lt;br /&gt;
float LPVector::operator ^(LPVector vector)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;float a = 0.0;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;//Si las dimensiones son diferentes , tenemos un problema grave.&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;if (n != vector.n)&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;cout &amp;lt;&amp;lt; &quot;ERROR DIMENSIONAL ENTRE VECTORES\n&quot;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;return 0.0;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;for(int i = 0 ; i &amp;lt; n ; ++i)&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;a += v[i] * vector.v[i];&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;return a;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float LPVector::module()&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;float a = 0.0;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;for(int i = 0 ; i &amp;lt; n ; ++i)&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;a += v[i] * v[i];&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;return sqrt(a);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float LPVector::distance(LPVector vector)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;float a = 0.0;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;float temp = 0.0;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;//Si las dimensiones son diferentes , tenemos un problema grave.&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;if (n != vector.n)&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;cout &amp;lt;&amp;lt; &quot;ERROR DIMENSIONAL ENTRE VECTORES\n&quot;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;return (-1.0);&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;for(int i = 0 ; i &amp;lt; n ; ++i)&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;temp = (v[i] - vector.v[i]);&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;a+=temp*temp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;return sqrt(a);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
LPVector.h&lt;br /&gt;
/**************************************************************************************************/&lt;br /&gt;
//&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;Código creado por F.Bordas (LordPakus) como ejemplo de creación de un math engine&lt;br /&gt;
//&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;para el blog LordPakus (http://lordpakus.blogspot.com/). &lt;br /&gt;
//&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;Prohibida la distribución fuera de este blog sin el permiso expreso del autor&lt;br /&gt;
/**************************************************************************************************/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**************************************************************************************************/&lt;br /&gt;
// LPVector.h &lt;br /&gt;
/**************************************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#ifndef __LPVector__&lt;br /&gt;
#define __LPVector__&lt;br /&gt;
&lt;br /&gt;
class LPVector&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;LPVector();&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;~LPVector();&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;//Funciones anexas.&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;void Set(int t, float* vector); //Funcion para inicializar un vector de n elementos&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;void Delete();&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;//Función para limpiar la variable vector&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;void print();&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;//Función para imprimir el vector por la consola&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;void random(int t,float min, float max);&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;//Función para rellenar de random un vector de t posiciones&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;//OPERACIONES DE AMULACIÓN DE RESULTADO (+=,-=,etc...), devuelven void como norma general&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;//Operaciones vectoriales&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;void operator +=(LPVector vector);&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;void operator -=(LPVector vector);&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;void cross(LPVector vector);&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;//Calculamos el producto vectorial (cross) POR HACER&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;void sqrt_vec();&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;//Calculamos la raíz cuadrada de todo los elementos del vector&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;void normalize();&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;//Normaliza el vector (hace que el módulo sea 1)&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;//Operaciones con escalares ( sumar , restar , etc ... todo un vector por un escalar)&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;void operator +=(float scal);&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;void operator -=(float scal);&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;void operator *=(float scal);&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;void operator /=(float scal);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;//OPERACIONES QUE DEVUELVEN ALGO (NO ACUMULADORES: +,-,*, etc...)&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;//Operaciones vectoriales que devuelven escalares&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;float operator ^(LPVector vector);&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;//Operador producto escalar.&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;float module();&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;//Calcula el módulo del vector&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;float distance(LPVector vector);&lt;br /&gt;
&lt;br /&gt;
public:&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;int n;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; //número de elementos del vector&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;float *v;&amp;nbsp;&amp;nbsp;&amp;nbsp; //puntero a memoria dinámica&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
Cualquier otra cosa que se os ocurra que le pongamos o cualquier fallo que veais, hacedmelo llegar&lt;br /&gt;
&lt;br /&gt;
Espero que os haya gustado,&lt;br /&gt;
&lt;br /&gt;
Nos vemos</content><link rel='replies' type='application/atom+xml' href='http://mathengine.blogspot.com/feeds/3932410782264098652/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://mathengine.blogspot.com/2011/09/math-engine-capitulo-2-clase-lpvector.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9095652577974359156/posts/default/3932410782264098652'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9095652577974359156/posts/default/3932410782264098652'/><link rel='alternate' type='text/html' href='http://mathengine.blogspot.com/2011/09/math-engine-capitulo-2-clase-lpvector.html' title='Math Engine : Capitulo 2. Clase LPVector'/><author><name>LordPakus</name><uri>http://www.blogger.com/profile/10396031062672881371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9095652577974359156.post-617655915403623085</id><published>2011-09-08T10:11:00.000-07:00</published><updated>2011-09-08T10:11:12.810-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="math engine"/><category scheme="http://www.blogger.com/atom/ns#" term="operaciones matriz-matriz"/><category scheme="http://www.blogger.com/atom/ns#" term="operaciones matriz-vector"/><category scheme="http://www.blogger.com/atom/ns#" term="operaciones vector-matriz"/><category scheme="http://www.blogger.com/atom/ns#" term="operaciones vector-vector"/><category scheme="http://www.blogger.com/atom/ns#" term="sobrecarga de operadores"/><title type='text'>Math Engine : Capitulo 1. Sobrecarga de operadores</title><content type='html'>El artículo original lo podeís encontrar &lt;b&gt;&lt;a href=&quot;http://lordpakus.blogspot.com/2011/08/math-engine-capitulo-1-sobrecarga-de.html&quot; style=&quot;color: red;&quot;&gt;aqui&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
En este capitulo no haremos mucho más que iniciar las bases del proyecto.&lt;br /&gt;
&lt;br /&gt;
Conceptos fundamentales:&lt;br /&gt;
1. Todo el código se escribirá en un inicio en C/C++&lt;br /&gt;
2.  Todo el código se intentará encapsular en clases (aunque en prinicipio  no habrá gestores como en el game engine, usease el MathEngine será una  colección de funcionalidades matematicas no un motor que correrá de  fondo gestionandolo todo).&lt;br /&gt;
3. Todas las optimizaciones irán con  ifdef (así se podrán hacer diferentes compilaciones optimizadas en  función de la arquitectura en que se trabaje : tipo de ensamblador, tipo  de procesador, etc...). Las optimizaciones mínimas que se tienen en  cuenta ahora mismo son paralelización multicore y ensamblador vectorial  SSE.&lt;br /&gt;
4. El código que gestione el usuario ha de ser mínimo , claro y sencillo.&lt;br /&gt;
5. Habrá 3 grandes bloques de trabajo: operaciones entre vectores, operaciones entre matrices y operaciones vector-matriz.&lt;br /&gt;
6.  Las operaciones se irán implementado a medida que vosotros las vayais  pidiendo así que si os interesa algún función en particular no dudeis en  pedirla.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dicha toda esta parrafada, expondremos el capitulo como tal.&lt;br /&gt;
&lt;br /&gt;
Lo  primero será crear el proyecto. Deberiais saber hacerlo pero si no  teneis mucha memoria :D, podeis mirar como se creó el proyecto en el  game engine (&lt;a href=&quot;http://lordpakus.blogspot.com/2011/05/gameengine-capitulo-1.html&quot;&gt;http://lordpakus.blogspot.com/2011/05/gameengine-capitulo-1.html&lt;/a&gt;).&lt;br /&gt;
&lt;br /&gt;
Una  vez tengais el proyecto creado cread los siguientes archivos y copiad  el siguiente código. Vereis que no es más un código muy sencillo de  operación entre vectores.&lt;br /&gt;
&lt;br /&gt;
main.cpp:&lt;br /&gt;
/**************************************************************************************************/&lt;br /&gt;
//&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Código creado por F.Bordas (LordPakus) como ejemplo de creación de un math engine&lt;br /&gt;
//&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; para el blog LordPakus (http://lordpakus.blogspot.com/). &lt;br /&gt;
//&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Prohibida la distribución fuera de este blog sin el permiso expreso del autor&lt;br /&gt;
/**************************************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/**************************************************************************************************/&lt;br /&gt;
// main.cpp : Main de nuestro MathEngine&lt;br /&gt;
/**************************************************************************************************/&lt;br /&gt;
&lt;br /&gt;
//Include del Math engine&lt;br /&gt;
#include &quot;LPMath.h&quot;&lt;br /&gt;
&lt;br /&gt;
//Delete console&lt;br /&gt;
//#pragma comment(linker, &quot;/subsystem:\&quot;windows\&quot; /entry:\&quot;mainCRTStartup\&quot;&quot;)&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //Usada para imprimir por consola&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
int main (int argc, char* argv[]) &lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; LPVector4 v1,v2;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; v1.Set(0.0f,1.0f,2.0f,3.0f);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; v2.Set(1.1f,1.2f,1.3f,1.4f);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; v1 += v2;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; &quot;Vector 1: &quot;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; v1.print();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; &quot;\n&quot;;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; &quot;Vector 2: &quot;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; v2.print();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
LPMath.h&lt;br /&gt;
/**************************************************************************************************/&lt;br /&gt;
//&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Código creado por F.Bordas (LordPakus) como ejemplo de creación de un math engine&lt;br /&gt;
//&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; para el blog LordPakus (http://lordpakus.blogspot.com/). &lt;br /&gt;
//&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Prohibida la distribución fuera de este blog sin el permiso expreso del autor&lt;br /&gt;
/**************************************************************************************************/&lt;br /&gt;
&lt;br /&gt;
//Lista de todos los includes necesarios para el math engine.&lt;br /&gt;
&lt;br /&gt;
#include &quot;LPVector4.h&quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
LPVector4.h&lt;br /&gt;
/**************************************************************************************************/&lt;br /&gt;
//&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Código creado por F.Bordas (LordPakus) como ejemplo de creación de un math engine&lt;br /&gt;
//&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; para el blog LordPakus (http://lordpakus.blogspot.com/). &lt;br /&gt;
//&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Prohibida la distribución fuera de este blog sin el permiso expreso del autor&lt;br /&gt;
/**************************************************************************************************/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**************************************************************************************************/&lt;br /&gt;
// LPVector.h &lt;br /&gt;
/**************************************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#ifndef __LPVector4__&lt;br /&gt;
#define __LPVector4__&lt;br /&gt;
&lt;br /&gt;
class LPVector4&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; void Set(float x, float y , float z , float t); //Funcion para inicializar un vector de 4 elementos&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; void print();&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //Función para imprimir el vector por la consola&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; void operator +=(const LPVector4 v);&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //Sobrecarga de operador +=&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
public:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; float xv,yv,zv,tv;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
LPVector4.cp&lt;br /&gt;
/**************************************************************************************************/&lt;br /&gt;
//&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Código creado por F.Bordas (LordPakus) como ejemplo de creación de un math engine&lt;br /&gt;
//&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; para el blog LordPakus (http://lordpakus.blogspot.com/). &lt;br /&gt;
//&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Prohibida la distribución fuera de este blog sin el permiso expreso del autor&lt;br /&gt;
/**************************************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#include &quot;LPVector4.h&quot;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //Usada para imprimir por consola&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
void LPVector4::Set(float x, float y , float z , float t) //Funcion para inicializar un vector de 4 elementos&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; xv = x;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; yv = y;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; zv = z;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; tv = t;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Imprimimos el valor del vector&lt;br /&gt;
void LPVector4::print()&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; &quot;x: &quot; &amp;lt;&amp;lt; xv &amp;lt;&amp;lt; &quot; y: &quot; &amp;lt;&amp;lt; yv &amp;lt;&amp;lt; &quot; z: &quot; &amp;lt;&amp;lt; zv &amp;lt;&amp;lt; &quot; t: &quot; &amp;lt;&amp;lt; tv;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Sobrecarga operador +=&lt;br /&gt;
void LPVector4::operator +=(const LPVector4 v)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; xv += v.xv;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; yv += v.yv;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; zv += v.zv;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; tv += v.tv;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para probar el ejecutable debereis hacerlo desde una consola para que os permita ver el resultado.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Por  ahora lo único que os debe interesar es como se ha hecho la sobrecarga  del operador += aplicado a los vectores ya que esta sobrecarga es de lo  que más se usara en el MathEngine para hacer que el código quede limpio  de cara al usuario.&lt;br /&gt;
&lt;br /&gt;
Sin más, aqui os dejo, espero que os lo hayais pasado bien y hayais aprendido&lt;br /&gt;
&lt;br /&gt;
Nos vemos</content><link rel='replies' type='application/atom+xml' href='http://mathengine.blogspot.com/feeds/617655915403623085/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://mathengine.blogspot.com/2011/09/math-engine-capitulo-1-sobrecarga-de.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9095652577974359156/posts/default/617655915403623085'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9095652577974359156/posts/default/617655915403623085'/><link rel='alternate' type='text/html' href='http://mathengine.blogspot.com/2011/09/math-engine-capitulo-1-sobrecarga-de.html' title='Math Engine : Capitulo 1. Sobrecarga de operadores'/><author><name>LordPakus</name><uri>http://www.blogger.com/profile/10396031062672881371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9095652577974359156.post-2009487584531746546</id><published>2011-09-08T10:08:00.000-07:00</published><updated>2011-09-08T10:08:55.919-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="derivación"/><category scheme="http://www.blogger.com/atom/ns#" term="FFT"/><category scheme="http://www.blogger.com/atom/ns#" term="integración"/><category scheme="http://www.blogger.com/atom/ns#" term="libreria matematica"/><category scheme="http://www.blogger.com/atom/ns#" term="matematicas"/><category scheme="http://www.blogger.com/atom/ns#" term="math engine"/><category scheme="http://www.blogger.com/atom/ns#" term="motor de matematicas"/><category scheme="http://www.blogger.com/atom/ns#" term="tratamiento de funciones"/><title type='text'>Math Engine : Capitulo 0. Esquema de un math engine</title><content type='html'>El artículo original lo podeís encontrar en : &lt;b style=&quot;color: red;&quot;&gt;&lt;a href=&quot;http://lordpakus.blogspot.com/2011/09/math-engine-capitulo-0-esquema-de-un.html&quot;&gt;aquí &lt;/a&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Hola a todos...&lt;br /&gt;
&lt;br /&gt;
Igual que hice con el&lt;a href=&quot;http://lordpakus.blogspot.com/2011/06/gameengine-capitulo-0-esquema-del-game.html&quot;&gt; game engine&lt;/a&gt;  aquí os dejo un esquema del math engine para que podais entender y  acceder más facilmente a cada una de sus partes.&lt;br /&gt;
&lt;br /&gt;
El LP Math Engine&amp;nbsp; tiene tres clases principales&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Vector: &lt;/b&gt;La  clase vector contiene un vector de floats de tamaño arbitrario y todas  las funciones asociadas de intereacción entre vector-vector y  vector-escalar.&lt;b&gt; &lt;/b&gt;&lt;a href=&quot;http://lordpakus.blogspot.com/2011/08/math-engine-capitulo-2-clase-lpvector.html&quot;&gt;http://lordpakus.blogspot.com/2011/08/math-engine-capitulo-2-clase-lpvector.html&lt;/a&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&lt;b&gt;Matriz:&lt;/b&gt;  La clase matriz contiene un matriz de floats de dimensiones arbiarias y  todas las funciones asociadas de interacción entre matriz-matriz,  matriz-vector y matriz-escalar.&lt;a href=&quot;http://lordpakus.blogspot.com/2011/08/math-engine-capitulo-3-clase-lpmatrix.html&quot;&gt;http://lordpakus.blogspot.com/2011/08/math-engine-capitulo-3-clase-lpmatrix.html&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Serie de datos: &lt;/b&gt;La  clase serie de datos contiene un vector de datos de longitud arbitraria  que se pueden interpretar como una serie estadistica, una  discretización de señal, un muestreo de función matemática,etc..  Incorpora funciones de tratamiento de la señal (FFT por ejemplo), de  tratamiento de funciones (derivación e integración) y de tratamiento  estadístico (medias, varianzas, modelos estadisticos,rectas de  regresión) &lt;a href=&quot;http://lordpakus.blogspot.com/2011/08/math-engine-capitulo-4-clase-lpdata.html&quot;&gt;http://lordpakus.blogspot.com/2011/08/math-engine-capitulo-4-clase-lpdata.html&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Aparte de estas clases el math engine tiene dos caracteristicas importantes:&lt;br /&gt;
-&amp;gt; &lt;b&gt;Sobrecarga de operadores: &lt;/b&gt;Es  decir, se basa en esta caracteristica de la POO para facilitar el  trabajo al programador de aplicaciones matematicas, escondiendo cientos o  miles de lineas de código en operciones sencillas de entender  conceptualmente &lt;a href=&quot;http://lordpakus.blogspot.com/2011/08/math-engine-capitulo-1-sobrecarga-de.html&quot;&gt;http://lordpakus.blogspot.com/2011/08/math-engine-capitulo-1-sobrecarga-de.html&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
-&amp;gt; &lt;b&gt;Uso de optimizaciones:&lt;/b&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - &lt;b&gt;Ensamblador SSE: &lt;/b&gt;El  ensamblador SSE es un conjunto de operaciones que tienen la mayoria de  procesadores actuales que permiten realizar numerosas operaciones en  paralelo. Para más información podeis mirar: &lt;a href=&quot;http://lordpakus.blogspot.com/2011/08/curso-de-programacion-capitulo-7.html&quot;&gt;http://lordpakus.blogspot.com/2011/08/curso-de-programacion-capitulo-7.html&lt;/a&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&amp;nbsp; Ejemplo de SSE en la suma de vectores:&amp;nbsp;&lt;/b&gt; &lt;a href=&quot;http://lordpakus.blogspot.com/2011/09/math-engine-capitulo-5-lpvector-con.html&quot;&gt;http://lordpakus.blogspot.com/2011/09/math-engine-capitulo-5-lpvector-con.html&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &lt;b&gt;Ejemplo de SSE en la distancia entre vectores:&lt;/b&gt; &lt;a href=&quot;http://lordpakus.blogspot.com/2011/09/math-engine-capitulo-6-vectordistance.html&quot;&gt;http://lordpakus.blogspot.com/2011/09/math-engine-capitulo-6-vectordistance.html&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - &lt;b&gt;Paralelización multicore&lt;/b&gt;: WORKING. En breve tendremos tutoriales de paralelización&lt;br /&gt;
&lt;br /&gt;
Espero que os haya gustado y que os haya ayudado a organizar la información&lt;br /&gt;
&lt;br /&gt;
Nos vemos</content><link rel='replies' type='application/atom+xml' href='http://mathengine.blogspot.com/feeds/2009487584531746546/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://mathengine.blogspot.com/2011/09/math-engine-capitulo-0-esquema-de-un.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9095652577974359156/posts/default/2009487584531746546'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9095652577974359156/posts/default/2009487584531746546'/><link rel='alternate' type='text/html' href='http://mathengine.blogspot.com/2011/09/math-engine-capitulo-0-esquema-de-un.html' title='Math Engine : Capitulo 0. Esquema de un math engine'/><author><name>LordPakus</name><uri>http://www.blogger.com/profile/10396031062672881371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>