// BIBLIOTECA DE VECTORES Y MATRICES By CompSystems aka (jaiMeza) version 0.2.0 Noviembre 3 del 2014 //jaimeza.org
#include <iostream>
#include <cstdlib>
#include<vector>
#include<algorithm>
#include <iomanip> // Para salidas como: cout<< setw ( 3 )
using namespace std;
typedef vector<int> TYPE_VECTOR_INT; define palabra clave VECTOR_INT como tipo vector
typedef vector< TYPE_VECTOR_INT > TYPE_MATRIX2D_INT; // OR //typedef vector< vector<int> > TYPE_MATRIX2D_INT; //
//typedef vector< vector<int> > TYPE_MATRIX3D;
TYPE_VECTOR_INT Make_vector( int n ){ // un solo argumento
TYPE_VECTOR_INT vector( n ); // crea un vector o formacion unidimensional
// vector<int> mi_vector(n);
return vector;
}
// Funcion igual a la anterior pero con dos argumentos, el segundo valor es la constante a almacenar en todos el arreglo
TYPE_VECTOR_INT Make_vector( int n, int constante ){
TYPE_VECTOR_INT vector( constante ); // crea un vector o formacion unidimensional
// vector<int> mi_vector(n, constante );
return vector;
}
// Funcion igual a la anterior pero sin argumentos, crea un arreglo unidemencional de tamnanio expandible
TYPE_VECTOR_INT Make_vector( void ){
TYPE_VECTOR_INT vector; // crea un vector o formacion unidimensional
// vector<int> mi_vector;
return vector;
}
TYPE_MATRIX2D_INT Make_matriz2D( int n, int m ){
TYPE_MATRIX2D_INT matriz2D(n, TYPE_VECTOR_INT(m) ); // crea un arreglo o formacion bidimensional (matriz)
//vector< vector<int> > mi_matriz_2D(n, vector<int>(m) );
return matriz2D;
}
int SIZE_N_VECTOR( TYPE_VECTOR_INT vector_in ){
return vector_in.size();
}
int SIZE_N_MATRIX2D( TYPE_MATRIX2D_INT matriz2D_in ){
return matriz2D_in.size();
}
int SIZE_M_MATRIX2D( TYPE_MATRIX2D_INT matriz2D_in ){
return matriz2D_in[0].size( );
}
bool Es_matriz2D_cuadrada( TYPE_MATRIX2D_INT matriz2D_in ){
if ( Es_matriz2D( INT matriz2D_in ) ){
int size_n = SIZE_N_MATRIX2D( matriz2D_in );
int size_m = SIZE_M_MATRIX2D( matriz2D_in );
if ( size_n == size_m )
return true;
else
return false;
}
}
bool Es_matriz2D( TYPE_MATRIX2D_INT matriz2D_in ){
int size_n = SIZE_N_MATRIX2D( matriz2D_in );
int size_m = SIZE_M_MATRIX2D( matriz2D_in );
if ( size_n >= 1 and size_m >= 1 )
return true;
else
return false;
}
bool Es_vector( TYPE_VECTOR_INT vector_in ){
int size_n = SIZE_N_VECTOR( vector_in );
if ( size_n >= 1 )
return true;
else
return false;
}
TYPE_MATRIX2D_INT Ingresar_matriz_2D( int n, int m ){
if ( n>0 and m>0 ){
TYPE_MATRIX2D_INT matriz2D=Make_matriz2D(n, m); // crea un arreglo o formacion bidimensional (matriz)
cout << "Introducir elementos en la matriz de " << n << " filas x " << m << " columnas" << endl;
for ( int i = 0; i < n; i++ ) {
for ( int j = 0; j < m; j++ ){
cout << "Elemento posicion ("<<i+1<<","<<j+1<<")= ";
cin >> matriz2D[i][j];
}
}
cout<<endl;
return matriz2D;
}
//else ;// como aborto la ejecucion?
}
TYPE_VECTOR_INT Ingresar_vector( int n ){
if ( n>=1 ){
TYPE_VECTOR_INT vector=Make_vector(n);
cout << "Introducir elementos en el VECTOR de " << n << " valores" << endl;
for ( int j = 0; j < n; j++ ){
cout << "Elemento posicion ("<<j+1<<")= ";
cin >> vector[j];
}
cout<<endl;
return vector;
}
//else ;// como aborto la ejecucion?
}
void Imprimir_vector2D( TYPE_VECTOR_INT vector_in ){
cout << "Vista en 2D del vector" << endl;
int size_n = SIZE_N_VECTOR( vector_in );
for ( int j = 1; j <= size_n; j++ ){
if (j == 1) cout<< setw ( 3 ) << "[[";
cout << setw ( 3 ) << vector_in[j-1];
if (j != size_n) cout << ",";
if (j == size_n) cout << setw ( 3 ) << "]]"<< endl;
}
}
void Imprimir_matriz2D( TYPE_MATRIX2D_INT matriz2D_in, int m ){
cout << "Vista en 2D de la matriz" << endl;
int size_n = SIZE_N_MATRIX2D( matriz2D_in );
cout<< setw ( 3 ) << "[[";
for ( int i = 1; i <= size_n; i++ ){
for ( int j = 1; j <= m; j++ ){
if (i*j == i and i*j != 1 )
cout << setw ( 3 ) << "[";
cout << setw ( 3 ) << matriz2D_in[i-1][j-1];
if (j != m) cout << ",";
if (i*j == i*m)
cout<< setw ( 3 ) << "]";
if (i*j == size_n*m )
cout << "]";
}
cout << endl;
}
}
bool Es_matriz2D_identidad( TYPE_MATRIX2D_INT matriz2D_in ){
if ( Es_matriz2D( INT matriz2D_in ) ){
bool flag_mIdentidad=true; // flag (indicador) de matriz identidad
int i=0, j=0; // posicion inicial
int size_n = SIZE_N_MATRIX2D( matriz2D_in );
while( i < size_n and (flag_mIdentidad == true) ){ // recorre por filas y verifica el flag de identidad ( solo 1s en la diagonal y 0s en el resto )
while( j < size_n and flag_mIdentidad ){ // recorre por columnas
flag_mIdentidad = ( (i==j and matriz2D_in[i][j] == 1 )// en posiciones iguales de i, j debe haber un 1, retorna true
or (i != j and matriz2D_in[i][j] == 0 ) ); // en posiciones diferentes de i, j debe haber un 0, retorna true
// si las dos condiciones anteriores son falsas, no es una matriz identidad
if( flag_mIdentidad == true )
j++; // incrementa el numero de columna
}
i++; // incrementa el numero de fila
}
return flag_mIdentidad;
}
}
bool Es_matriz2D_triangularSup( TYPE_MATRIX2D_INT matriz2D_in ){
if ( Es_matriz2D_cuadrada( matriz2D_in ) == true ){
bool p=false; // flag (indicador) de triangularidad
int i=0,j=0; // posicion inicial
int size_n = SIZE_N_MATRIX2D( matriz2D_in );
while( i < size_n and not p ){ // recorre por filas y verifica el flag de triangularidad superior
while(j<size_n and not p){
if( (i==j and matriz2D_in[i][j]==0 ) or ( i>j and matriz2D_in[i][j]!=0) )
p=true;
else
j++;
}
i++;
}
return p;
}
}
bool Es_matriz2D_triangularInf( TYPE_MATRIX2D_INT matriz2D_in ){
if ( Es_matriz2D_cuadrada( matriz2D_in ) == true ){
bool p=false; // flag (indicador) de triangularidad inferior
// ... en construccion
return p;
}
}
bool Es_matriz2D_simetrica( TYPE_MATRIX2D_INT matriz2D_in ){
if ( Es_matriz2D_cuadrada( matriz2D_in ) == true ){
bool p=true;
int i=0;
int size_n = SIZE_N_MATRIX2D( matriz2D_in );
while(i< size_n-1 and p){
int j=i+1;
while(j< size_n and p){
if( matriz2D_in[i][j]!= matriz2D_in[j][i])
p=false;
else
j++;
}
i++;
}
return p;
}
}
bool Es_matriz2D_antsimetrica( TYPE_MATRIX2D_INT matriz2D_in ){
if ( Es_matriz2D_cuadrada( matriz2D_in ) == true ){
bool p=true;
// ... en construccion
return p;
}
}
//TYPE_MATRIX2D_INT Determinante( TYPE_MATRIX2D_INT matriz2D_in ){} // ... en construccion
int main(int argc, char *argv[]) {
// pedir dimension de entrada (2D)
int m,n;
cout<<"introduzca el numero de filas: ";
cin>>n;
cout<<"introduzca el numero de columnas: ";
cin>>m;
cout<<'\n';
TYPE_MATRIX2D_INT matriz=Make_matriz2D(n, m); // crea un arreglo o formacion bidimensional (matriz)
Es_matriz2D(matriz);
matriz = Ingresar_matriz_2D( n, m );
Imprimir_matriz2D( matriz, m );
cout<<'\n';
// chequeo si es una matriz identidad
if( Es_matriz2D_identidad( matriz ) == true )
cout<<"la matriz es identidad"<<endl;
else
cout<<"la matriz no es identidad"<<endl;
// chequeo si es una matriz triangular superior
if( Es_matriz2D_triangularSup( matriz ) == true )
cout<<"la matriz ingresada no es triangular superior"<<endl;
else
cout<<"la matriz ingresada no es triangular superior"<<endl;
// ¿Es una matriz simétrica?
if( Es_matriz2D_simetrica( matriz ) == true )
cout<<"la matriz ingresada no es simetrica"<<endl;
else
cout<<"la matriz ingresada no es simetrica"<<endl;
cout<<'\n';
TYPE_VECTOR_INT mi_vector = Make_vector(4);
Imprimir_vector2D(mi_vector);
Es_vector(mi_vector);
mi_vector = Ingresar_vector(4);
Imprimir_vector2D(mi_vector);
TYPE_VECTOR_INT mi_vector2 = Make_vector(4,1); // crea un vector de 4 elementos lleno de 1s
Imprimir_vector2D(mi_vector2);
// reasignacion
mi_vector2[0] = 9;
mi_vector2[1] = 8;
mi_vector2[2] = 7;
mi_vector2[3] = 6;
Imprimir_vector2D(mi_vector2);
TYPE_VECTOR_INT mi_vector3 = Make_vector();
mi_vector3.push_back(10); // agrega un elemento al vector pos [0]
mi_vector3.push_back(20); // agrega un elemento al vector pos [1]
mi_vector3.push_back(30); // agrega un elemento al vector pos [2]
cout<< mi_vector3[0]<< " "<< mi_vector3[1]<< " "<< mi_vector3[2] << endl ;
Imprimir_vector2D(mi_vector3);
cout<<'\n';
system("pause");
return 0;
}
//ejemplos
// identidad
// http://es.wikipedia.org/wiki/Matriz_identidad
// [[1, 0]
// [0, 1]
// triangular superior e inferior
// http://es.wikipedia.org/wiki/Matriz_triangular
// [[1, 4, 2]
// [0, 3, 4]
// [0, 0, 1]]
// simetrica
// http://es.wikipedia.org/wiki/Matriz_sim%C3%A9trica
// [[-8, -1, 3]
// [-1, 7, 4]
// [3, 4, 9]]
// Matriz antisimétrica
// http://es.wikipedia.org/wiki/Matriz_antisim%C3%A9trica
// Matriz_transpuesta
// http://es.wikipedia.org/wiki/Matriz_transpuesta