Capítulo perteneciente al math engine LordPakus
Hola a todos,
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.
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.
No obstante, si quereis ir probando código aquí os dejo lo que he implementado hasta el momento:
LPMatrix.h:
/**************************************************************************************************/
// Código creado por F.Bordas (LordPakus) como ejemplo de creación de un math engine
// para el blog LordPakus (http://lordpakus.blogspot.com/).
// Prohibida la distribución fuera de este blog sin el permiso expreso del autor
/**************************************************************************************************/
/**************************************************************************************************/
// LPMatrix.h
/**************************************************************************************************/
#ifndef __LPMatrix__
#define __LPMatrix__
class LPMatrix
{
public:
LPMatrix();
~LPMatrix();
//Funciones anexas.
void Set(int t, int k, float* vector); //Funcion para inicializar una matriz de t*k elementos
void Delete(); //Función para limpiar la variable matriz
void print(); //Función para imprimir la matriz por la consola
//OPERACIONES DE ACUMULACIÓN DE RESULTADO (+=,-=,etc...), devuelven void como norma general
//Operaciones vectoriales
void operator +=(LPMatrix matrix);
void operator -=(LPMatrix matrix);
//Operaciones con escalares ( sumar , restar , etc ... todo una matriz por un escalar)
void operator +=(float scal);
void operator -=(float scal);
void operator *=(float scal);
void operator /=(float scal);
public:
int m,n; //dimensiones de la matriz
float **p; //puntero a memoria dinámica para matrices
};
#endif
LPMatrix.cpp:
/**************************************************************************************************/
// Código creado por F.Bordas (LordPakus) como ejemplo de creación de un math engine
// para el blog LordPakus (http://lordpakus.blogspot.com/).
// Prohibida la distribución fuera de este blog sin el permiso expreso del autor
/**************************************************************************************************/
#include "LPMatrix.h"
#include <math.h>
#include <iostream> //Usada para imprimir por consola
using namespace std;
//Constructor
LPMatrix::LPMatrix()
{
n = 0;
m = 0;
p = NULL;
}
//Destructor
LPMatrix::~LPMatrix()
{
}
//Funciones anexas.
void LPMatrix::Set(int t, int k, float* vector) //Funcion para inicializar una matriz de t*k elementos
{
//Inicializamos el número de elementos del vector
n = t;
m = k;
//Creamos un vector de memoria dinámica donde almacenaremos los punteros subsiguientes.
p = (float**) malloc( sizeof(float *) * n );
//Creamos cada una de las filas o columnas (como queramos verlo) de la matriz
for(int i = 0 ; i < n ; ++i )
p[i] = (float*) malloc( sizeof(float) * m );
//Copiamos el vector externo en el vector interno
for(int i = 0 ; i < n*m ; ++i )
p[i/m][i%m] = vector[i];
}
void LPMatrix::Delete() //Función para limpiar la variable matriz
{
for(int i = 0 ; i < n ; ++i )
free(p[i]);
n=0;
m=0;
free(p);
}
void LPMatrix::print() //Función para imprimir la matriz por la consola
{
for(int i = 0 ; i < n*m ; ++i)
{
if(!(i%m))
cout << "\n";
cout << (float) p[i/m][i%m] << " ";
}
}
//OPERACIONES DE ACUMULACIÓN DE RESULTADO (+=,-=,etc...), devuelven void como norma general
//Operaciones vectoriales
void LPMatrix::operator +=(LPMatrix matrix)
{
//Si las dimensiones son diferentes , tenemos un problema grave.
if ( (n != matrix.n) || (m != matrix.m) )
{
cout << "ERROR DIMENSIONAL ENTRE MATRICES\n";
return;
}
for(int i = 0 ; i < n ; ++i)
for(int j = 0 ; j < m ; ++j)
p[i][j] += matrix.p[i][j];
}
void LPMatrix::operator -=(LPMatrix matrix)
{
//Si las dimensiones son diferentes , tenemos un problema grave.
if ( (n != matrix.n) || (m != matrix.m) )
{
cout << "ERROR DIMENSIONAL ENTRE MATRICES\n";
return;
}
for(int i = 0 ; i < n ; ++i)
for(int j = 0 ; j < m ; ++j)
p[i][j] -= matrix.p[i][j];
}
//Operaciones con escalares ( sumar , restar , etc ... todo una matriz por un escalar)
void LPMatrix::operator +=(float scal)
{
for(int i = 0 ; i < n ; ++i)
for(int j = 0 ; j < m ; ++j)
p[i][j] += scal;
}
void LPMatrix::operator -=(float scal)
{
for(int i = 0 ; i < n ; ++i)
for(int j = 0 ; j < m ; ++j)
p[i][j] -= scal;
}
void LPMatrix::operator *=(float scal)
{
for(int i = 0 ; i < n ; ++i)
for(int j = 0 ; j < m ; ++j)
p[i][j] *= scal;
}
void LPMatrix::operator /=(float scal)
{
for(int i = 0 ; i < n ; ++i)
for(int j = 0 ; j < m ; ++j)
p[i][j] /= scal;
}
main.cpp
int main (int argc, char* argv[])
{
LPMatrix m1,m2;
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 };
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 };
m1.Set(3,5,mat1);
m2.Set(3,5,mat2);
cout << "Matriz 1:";
m1.print();
cout << "\n";
cout << "Matriz 2:";
m2.print();
cout << "\n";
cout << "Suma de matrices:";
m2 += m1;
m2.print();
cout << "\n";
//Eliminamos las matrices
m1.Delete();
m2.Delete();
system("PAUSE");
}
Espero que os haya servido y os haya gustado.
Nos vemos
Blog de programación enfocado a estudiantes principiantes de C/C++ en español. Dispone de cursos de todos los niveles y para multitud de usos.
Entradas populares
-
Una pregunta que me hacen en muchas ocasiones es ¿¿qué significa %2?? La respuesta tiene dos acepciones en función de si lo estamos u...
-
<< Ejemplo anterior Artículos Relacionados Ejemplo siguiente >> Hola a todos, ASCII Art es el hecho de hacer di...
-
Articulo perteneciente a : Referencias de programación Hola a todos Os pongo una aportación que a más de uno le irá bien, un resumen de ...
-
<< Ejemplo anterior Artículos Relacionados Ejemplo siguiente >> Hola a todos, El ejercicio de hoy se basa en c...
-
Capítulo perteneciente al tutorial de opengl desde cero Hola a todos, Este capítulo tal vez es de lo más complicados de la teoría necesa...
-
<< Capítulo anterior Artículos Relacionados Capítulo siguiente >> Hola a todos, Este tutorial intenta ser e...
-
<< Capítulo anterior Artículos Relacionados Capítulo siguiente >> Hola a todos... Un compañero vuestro ha...
-
Hola a todos... He aquí la primera entrega "Como crear tu propio motor de videojuegos y no morir en el intento". Antes que nada ...
-
<< Capítulo anterior Artículos Relacionados Capítulo siguiente >> El c apitulo de hoy trata sobre las instrucc...
-
Hola a todos Ya que he recibido un par de mails pidiéndome información sobre SEO, os adjunto unos cuantos trucos que he ido aprendiendo du...
0 comentarios :
Publicar un comentario