Untitled
unknown
plain_text
2 years ago
6.4 kB
11
Indexable
// matrix_operations in 3D
#include <cmath>
#include "vector.hpp"
#include "matrix.hpp"
void product_scalar_by_matrix(float scalar, Matrix *M, int n, int m, Matrix *R)
{
for (int r = 0; r < n; r++)
for (int c = 0; c < m; c++)
R->set(scalar * M->get(r, c), r, c);
}
void product_matrix_by_vector(Matrix *M, Vector *V, int n, int m, Vector *R)
{
for (int r = 0; r < n; r++)
{
float acc_n = 0;
for (int c = 0; c < n; c++)
acc_n += M->get(r, c) * V->get(c);
R->set(acc_n, r);
}
}
// Funcion que se usara en MEF_Process
void product_matrix_by_matrix(Matrix *A, Matrix *B, Matrix *R)
{
int n = A->getNrows(), m = A->getNcols(), p = B->getNrows(), q = B->getNcols();
if (m == p)
{
R->setSize(n, q);
R->init();
for (int r = 0; r < n; r++)
for (int c = 0; c < q; c++)
for (int i = 0; i < m; i++)
R->add(A->get(r, i) * B->get(i, c), r, c);
}
else
{
cout << "*****Dimension incompatibility when multiplying matrices.\n\n";
exit(EXIT_FAILURE);
}
}
float determinant(Matrix *M);
float determinant_auxiliar(Matrix *M)
{
int n = M->getNcols();
float acc_n = 0;
for (int c = 0; c < n; c++)
{
Matrix clon(n, n);
M->clone(&clon);
clon.removeRow(0);
clon.removeColumn(c);
acc_n += pow(-1, c) * M->get(0, c) * determinant(&clon);
}
return acc_n;
}
float determinant(Matrix *M)
{
float ans;
switch (M->getNcols())
{
case 1:
ans = M->get(0, 0);
break;
case 2:
ans = M->get(0, 0) * M->get(1, 1) - M->get(0, 1) * M->get(1, 0);
break;
case 3:
ans = M->get(0, 0) * M->get(1, 1) * M->get(2, 2) - M->get(0, 0) * M->get(1, 2) * M->get(2, 1) - M->get(0, 1) * M->get(1, 0) * M->get(2, 2) + M->get(0, 1) * M->get(1, 2) * M->get(2, 0) + M->get(0, 2) * M->get(1, 0) * M->get(2, 1) - M->get(0, 2) * M->get(1, 1) * M->get(2, 0);
break;
default:
ans = determinant_auxiliar(M);
}
return ans;
}
/*float getMinor(Matrix *M, int n, int r, int c)
{
Matrix clon(n, n);
M->clone(&clon);
// M.show();
// clon.show();
clon.removeRow(r);
clon.removeColumn(c);
// clon.show();
return determinant(&clon);
}*/
/*void conjugate_matrix(Matrix *M, int n, Matrix *C)
{
for (int r = 0; r < n; r++)
for (int c = 0; c < n; c++)
C->set(pow(-1, r + c) * getMinor(M, n, r, c), r, c);
}*/
// Funcion transpose
void transpose_matrix(Matrix *M, int n, int m, Matrix *T)
{
for (int r = 0; r < n; r++)
for (int c = 0; c < m; c++)
T->set(M->get(r, c), c, r);
}
void calculateZ_matrix(Matrix *A, int n, Matrix *Z)
{
// utilizando archivo de Cholesky del repositorio de github
float acum;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (i == j)
{
acum = 0;
for (int k = 0; k < j; k++)
{
// cout << L->get(j,k) << " ";
acum += pow(X->get(k, j), 2);
}
cout << A->get(j, j) << " " << acum << "\n";
if (A->get(j, j) - acum >= 0)
{
Z->set(sqrt(A->get(j, j) - acum), j, j);
}
else
{
Z->set(0.000001, j, j);
}
}
else
{
if (i > j)
{
if (X->get(j, j) != 0)
{
acum = 0;
for (int k = 0; k < j; k++)
{
acum += Z->get(i, k) * Z->get(j, k);
}
// cout << L->get(j,j) << "\n";
Z->set((1 / Z->get(j, j)) * (A->get(i, j) - acum), i, j);
}
else
{
Z->set(0.000001, i, j);
}
}
else
{
Z->set(0, i, j);
}
}
}
}
}
//mirar sino hay error en sintaxis
void calculateY_matrix(Matrix *Z, int n, Matrix *Y)
{
// utilizando archivo de Cholesky del repositorio de github
float acum;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (j == i)
{
if (Z->get(i, j) != 0)
{
Y->set(1 /Z->get(i, i), i, i);
}
else
{
Z->set(0.000001, i, j);
}
}
else
{
if (i > j)
{
if (Z->get(i, i) != 0)
{
acum = 0;
for (int k = j; k < i; k++)
{
acum += Z->get(i, k) * Y->get(k, j);
}
Y->set(-1(1 / Z->get(i, i)) * acum, i, j);
}
else{
Z->set(0.000001, i, j);
}
}
}
else{
Y->set(0, i, j);
}
}
}
}
void calculateX_matrix(Matrix* Y, Matrix* Z, int n, Matrix*X){
float acum;
for(int i = n-1 ; i>=0; i--)
for(int j = 0; j<n; j++){
if(Z->get(i,i)!=0){
acum = 0;
for(int k = i+1; k<n; k++){
acum += Z->get(k,i)*X->get(k,j);
}
X->set((1/Z->get(i,i))*(Y->get(i,j)-acum),i,j);
}
else{
X->set(0.000001,i,j);
}
}
}
void calculate_inverse(Matrix *M, int n, Matrix *X)
{
//Aplicando las formulas de las matriz de X,Y y Z
Matrix Z(n, n), Y(n,n);
Z.init();
Y.init();
calculateX_matrix(A,n,&L);
calculateY_matrix(&Z,n,&Y);
calculateZ_matrix(&Y,&Z,n,X);
}Editor is loading...