Advertisement
Guest User

Untitled

a guest
Mar 29th, 2020
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.86 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <cmath>
  4. #include <stdexcept>
  5. #include <iomanip>
  6. #define Eps 0.00000001
  7.  
  8. bool istiBrojevi(double x, double y){
  9.     return std::fabs(x - y) <=Eps * (std::fabs(x)+ std::fabs(y));
  10. }
  11.  
  12. bool isteMatrice(std::vector<std::vector<double>> a, std::vector<std::vector<double>> b){
  13.     for(int i=0; i<a.size(); i++){
  14.         for(int j=0; j<a.at(0).size(); j++) if(!istiBrojevi(a.at(i).at(j), b.at(i).at(j))) return false;
  15.     }
  16.     return true;
  17. }
  18.  
  19. std::vector<std::vector<double>> MnozenjeMatrica(std::vector<std::vector<double>> m1,std::vector<std::vector<double>> m2) {
  20.     if(m1.size() == 0 && m2.size()==0) return std::vector<std::vector<double>>();
  21.     if(m1.size()==0 or m2.size()==0) throw std::domain_error("Nije moguce mnozenje matrica!");
  22.     for(int i=0; i<m1.size(); i++){
  23.         if(m1.at(i).size() != m1.at(0).size()) throw std::domain_error("Neispravna matrica!");
  24.     }
  25.     for(int i=0; i<m2.size(); i++){
  26.         if(m2.at(i).size() != m2.at(0).size()) throw std::domain_error("Neispravna matrica!");
  27.     }
  28.    
  29.     if(m1.at(0).size() != m2.size()) throw std::domain_error("Nije moguce mnozenje matrica!");
  30.    
  31.    
  32.     std::vector<std::vector<double>> m3(m1.size(), std::vector<double>(m2.at(0).size()));
  33.     for(int i = 0; i < m1.size(); i++)
  34.     for(int j = 0; j < m2.at(0).size(); j++) {
  35.         double suma =0;
  36.         for(int k = 0; k < m2.size(); k++)
  37.         suma += m1.at(i).at(k) * m2.at(k).at(j);
  38.         m3.at(i).at(j) = suma;
  39.     }
  40.     return m3;
  41. }
  42.  
  43.  
  44. std::vector<std::vector<std::vector<double>>> DoolitleLU(std::vector<std::vector<double>> H){
  45.      std::vector<std::vector<std::vector<double>>> vrati;
  46.    
  47.      if(H.size()==0) return vrati;
  48.      for(int i=0; i<H.size(); i++) if(H.at(i).size()!=H.at(0).size()) throw std::domain_error("Neispravna matrica!");
  49.      if(H.size() != H.at(0).size()) throw std::domain_error("Matrica mora biti kvadratnog oblika!");
  50.    
  51.     vrati.resize(2);
  52.     vrati.at(0).resize(H.size(), std::vector<double>(H.size()));
  53.     vrati.at(1).resize(H.size(), std::vector<double>(H.size()));
  54.    
  55.     for (int i = 0; i < H.size(); i++) {
  56.         for (int k = i; k < H.size(); k++) {
  57.             double suma = 0;
  58.             for (int j = 0; j < i; j++)
  59.                 suma+= (vrati.at(0).at(i).at(j) * vrati.at(1).at(j).at(k));
  60.             vrati.at(1).at(i).at(k) = H.at(i).at(k) - suma;
  61.         }
  62.         for (int k = i; k < H.size(); k++) {
  63.             if (i == k) vrati.at(0).at(i).at(i) = 1;
  64.             else {
  65.                 double suma = 0;
  66.                 for (int j = 0; j < i; j++)
  67.                     suma+= (vrati.at(0).at(k).at(j) * vrati.at(1).at(j).at(i));
  68.                 vrati.at(0).at(k).at(i) = (H.at(k).at(i) - suma) / vrati.at(1).at(i).at(i);
  69.             }
  70.         }
  71.     }
  72.     return vrati;
  73.      
  74. }
  75. bool ProvjeriFaktorizaciju(std::vector<std::vector<double>> H, std::vector<std::vector<std::vector<double>>> K){
  76.    
  77.     if(H.size()==0 and K.size() == 0) return true;
  78.     if(K.size()!=2) return false;
  79.     for(int i=0; i<K.at(0).size(); i++) if(K.at(0).at(i).size() != K.at(0).at(0).size()) return false;
  80.     for(int i=0; i<K.at(1).size(); i++) if(K.at(1).at(i).size() != K.at(1).at(0).size()) return false;
  81.     for(int i=0; i<H.size(); i++) if(H.at(i).size()!=H.at(0).size()) return false;
  82.     if(H.size()!=H.at(0).size()) return false;
  83.     if(K.at(0).size() != K.at(0).at(0).size()) return false;
  84.     if(K.at(1).size() != K.at(1).at(0).size()) return false;        
  85.     if(H.size()!=K.at(0).size() || H.size()!=K.at(1).size() || K.at(0).size()!=K.at(1).size()) return false;
  86.     std::vector<std::vector<double>> m;
  87.     try{
  88.         m=MnozenjeMatrica(K.at(0), K.at(1));
  89.         return isteMatrice(m, H);
  90.     }
  91.     catch (std::domain_error e){
  92.         return false;
  93.     }
  94.    
  95.     return true;
  96.    
  97.    
  98. }
  99.    
  100. int main(){
  101.    
  102.  
  103.     return 0;
  104. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement