C++ Bc. 33 cpp
#include <iostream>
#include <matvec/symmat.h>
void cholesky(GNU_gama::Mat<>& A);
void cholesky(GNU_gama::SymMat<>& A);
int main()
{
{ /* reseni s plnou matici */
GNU_gama::Mat<> A(5,5);
A =
225, 210, 180, 135, 75,
210, 365, 311, 230, 122,
180, 311, 365, 266, 134,
135, 230, 266, 230, 110,
75, 122, 134, 110, 55;
std::cout.width(3);
std::cout << A;
cholesky(A);
std::cout.width(3);
std::cout << A;
}
{ /* reseni se symetrickou matici */
GNU_gama::SymMat<> A(5);
A =
225,
210, 365,
180, 311, 365,
135, 230, 266, 230,
75, 122, 134, 110, 55;
std::cout.width(3);
std::cout << A;
cholesky(A);
std::cout.width(3);
std::cout << A;
}
}
/* reseni s plnou matici */
void cholesky(GNU_gama::Mat<>& A)
{
const int N = A.rows();
for (int i=1; i<=N; i++)
{
// odmocnina z diagonalniho prvku
const double d = std::sqrt(A(i,i));
A(i,i) = d;
// vynulovani diagonalniho radku
for (int j=i+1; j<=N; j++) A(i,j) = 0;
// vypocet diagonalniho sloupce
for (int j=i+1; j<=N; j++) A(j,i) /= d;
// vypocet submatice B
for (int r=i+1; r<=N; r++)
for (int s=i+1; s<=N; s++)
A(r,s) -= A(r,i)*A(s,i);
}
}
/* reseni se symetrickou matici */
void cholesky(GNU_gama::SymMat<>& A)
{
const int N = A.rows();
for (int i=1; i<=N; i++)
{
// odmocnina z diagonalniho prvku
const double d = std::sqrt(A(i,i));
A(i,i) = d;
// vypocet diagonalniho sloupce
for (int j=i+1; j<=N; j++) A(j,i) /= d;
// vypocet submatice B
for (int r=i+1; r<=N; r++)
for (int s=i+1; s<=r; s++)
A(r,s) -= A(r,i)*A(s,i);
}
}
5 5 225 210 180 135 75 210 365 311 230 122 180 311 365 266 134 135 230 266 230 110 75 122 134 110 55 5 5 15 0 0 0 0 14 13 0 0 0 12 11 10 0 0 9 8 7 6 0 5 4 3 2 1 5 225 210 365 180 311 365 135 230 266 230 75 122 134 110 55 5 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
[ Zpět ]