Advertisement
TheMagnusRex

Matrix 2d

Jun 25th, 2017
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.15 KB | None | 0 0
  1. #include <iostream>
  2. #include <random>
  3. #include <fstream>
  4. #include <algorithm>
  5.  
  6. using namespace std;
  7.  
  8. struct matrix2d{
  9.     int m,n; //размеры матрицы
  10.     double **mass;//массив значений
  11.     matrix2d(int m1,int n1){ //конструктор, создаёт матрицу ml на nl
  12.         m=m1;
  13.         n=n1;
  14.         double **mass1=new double * [m];
  15.         for(int i=0;i<m;i++){
  16.             mass1[i]=new double [n];
  17.         }
  18.         mass=mass1;
  19.     }
  20.     void fill(matrix2d a);//Объявление функций, реализация представлена ниже
  21.     void show(matrix2d a);
  22.     void manul(matrix2d a);
  23.     matrix2d operator +(matrix2d b){ //оператор сложения двух матриц
  24.         int mmin =min(m,b.m);
  25.         int nmin = min(n,b.n);
  26.         matrix2d c(mmin,nmin);
  27.         for (int i=0;i<mmin;i++){
  28.             for (int j=0;j<nmin;j++){
  29.                 c.mass[i][j]=mass[i][j] + b.mass[i][j];
  30.             }
  31.         }
  32.         return c;
  33.     }
  34.     matrix2d operator -(matrix2d b){//операция разности матриц
  35.         int mmin =min(m,b.m);
  36.         int nmin = min(n,b.n);
  37.         matrix2d c(mmin,nmin);
  38.         for (int i=0;i<mmin;i++){
  39.             for (int j=0;j<nmin;j++){
  40.                 c.mass[i][j]=mass[i][j] - b.mass[i][j];
  41.             }
  42.         }
  43.         return c;
  44.     }
  45.  
  46.     matrix2d operator *(double numb){//умножение матрицы на число (порядок важен)
  47.         matrix2d c(m,n);
  48.         for (int i=0;i<m;i++){
  49.             for (int j=0;j<n;j++){
  50.                 c.mass[i][j]=numb*mass[i][j];
  51.             }
  52.         }
  53.         return c;
  54. }
  55.  
  56.     matrix2d operator /(double numb){// деление матрицы на число. (в общем-то, можно реализовать через умножение на 1\н)
  57.         matrix2d c(m,n);
  58.         for (int i=0;i<m;i++){
  59.             for (int j=0;j<n;j++){
  60.                 c.mass[i][j]=mass[i][j]/numb;
  61.             }
  62.         }
  63.         return c;
  64.     }
  65.  
  66.     matrix2d operator *(matrix2d b){ // перемножение матриц
  67.         if(n==b.m){
  68.             double cij=0;
  69.             matrix2d c(m,b.n);
  70.             for(int i=0;i<m;i++){
  71.                 for(int j=0;j<b.n;j++){
  72.                     for(int k=0;k<n;k++){
  73.                         cij+=(mass[i][k]*b.mass[k][j]);
  74.                     }
  75.                     c.mass[i][j]=cij;
  76.                     cij=0;
  77.                 }
  78.             }
  79.             return c;
  80.         }
  81.     }
  82.     void Rs(int k, int l){ // перестановка столбцов к и л
  83.         for (int i=0;i<m;i++){
  84.             swap(mass[i][k-1],mass[i][l-1]);
  85.         }
  86.     }
  87. };
  88. ostream &operator << (ostream &vyvod,matrix2d a){ //оператор для вывода матрицы через cout
  89.     for(int i=0;i<a.m;i++){
  90.         for(int j=0;j<a.n;j++){
  91.             vyvod<<a.mass[i][j]<<" ";
  92.         }
  93.         vyvod<<endl;
  94.     }
  95.     return vyvod;
  96. }
  97.  
  98. double det(matrix2d a);// объявление функции
  99.  
  100. double det_2(matrix2d a){ //детерминант 2*2
  101.     double ded = a.mass[0][0] *a.mass[1][1] - a.mass[1][0]*a.mass[0][1];
  102.     return ded;
  103. }
  104.  
  105. double det_3(matrix2d a){ //3*3
  106.     double ** c = new double * [3];
  107.     c=a.mass;
  108.     double ded_o =c[0][0]*c[1][1]*c[2][2]+c[0][1]*c[1][2]*c[2][0]+c[1][0]*c[2][1]*c[0][2];
  109.     double ded_p =c[0][2]*c[1][1]*c[2][0]+c[0][0]*c[2][1]*c[1][2]+c[0][1]*c[1][0]*c[2][2];
  110.     return (ded_o-ded_p);
  111. }
  112.  
  113. matrix2d M_(matrix2d a,int k,int l){//минор матрицы а, по элементу к.л
  114.     matrix2d mim(a.m-1,a.n-1);
  115.     int i1=0;
  116.     int j1=0;
  117.     for(int i=0;i<a.m;i++){
  118.         for(int j=0;j<a.n;j++){
  119.             if(i!=k-1&&j!=l-1){
  120.                 mim.mass[i1][j1]=a.mass[i][j];
  121.                 j1+=1;
  122.             }
  123.         }
  124.         j1=0;
  125.         if(i!=k-1){
  126.             i1+=1;
  127.         }
  128.     }
  129.     return mim;
  130. }
  131.  
  132. double A_(matrix2d a, int k, int l){ // алгебраическое дополнение элемента к, л, матрицы а
  133.     double A=det(M_(a,k,l));
  134.     if((k+l)%2==0){
  135.         return A;
  136.     }
  137.     else{
  138.         return -A;
  139.     }
  140. }
  141.  
  142. double znak(int o){ // вспомогательная функция, для вычисления определителя через перестановки
  143.     if(o==1||o==4){
  144.         return 1.0;
  145.     }
  146.     else{
  147.         return -1.0;
  148.     }
  149. }
  150.  
  151. double perdet(matrix2d a){ //вычисление детерминанта через перестановки
  152.     double deter = 0;
  153.     int k=1;
  154.     int ind[a.m];
  155.     for(int i=0;i<a.m;i++){
  156.         ind[i]=i;
  157.     }
  158.     do{
  159.         double temp=1.0;
  160.         for(int y=0;y<a.m;y++){
  161.             temp*=a.mass[y][ind[y]];
  162.         }
  163.         deter+=temp*znak(k);
  164.         if(k==4){
  165.             k=1;
  166.         }
  167.         else{
  168.             k+=1;
  169.         }
  170.     }
  171.     while(next_permutation(ind,ind+a.m));
  172.     return deter;
  173. }
  174.  
  175. double det(matrix2d a){ // вычисление детерминанта, для случая 2*2, 3*3 используется треугольгик, в другом случае правило Лапласса
  176.     if(a.n==a.n&&a.n==2){
  177.         return det_2(a);
  178.     }
  179.     if(a.n==a.n&&a.n==3){
  180.         return det_3(a);
  181.     }
  182.     else{
  183.         double determinat=0;
  184.         for(int j=0;j<a.n;j++){
  185.             determinat+=a.mass[0][j]*A_(a,1,j+1);
  186.         }
  187.         return determinat;
  188.     }
  189. }
  190.  
  191. ofstream &operator <<(ofstream &out,matrix2d a){ // оператор для вывода в файл
  192.     for(int i=0;i<a.m;i++){
  193.         for(int j=0;j<a.n;j++){
  194.             out<<a.mass[i][j]<<" ";
  195.         }
  196.         out<<endl;
  197.     }
  198.     return out;
  199. }
  200.  
  201. ifstream &operator >>(ifstream &in, matrix2d a){ // для записи из файла
  202.     for(int i=0;i<a.m;i++){
  203.         for(int j=0;j<a.n;j++){
  204.             in>>a.mass[i][j];
  205.         }
  206.     }
  207.     return in;
  208. }
  209.  
  210. void manul(matrix2d a){ // функция ручного ввода
  211.     for(int i=0;i<a.m;i++){
  212.         for(int j=0;j<a.n;j++){
  213.             cin>>a.mass[i][j];
  214.         }
  215.     }
  216. }
  217. void fill(matrix2d a){ // заполнение матрицы случайными числами
  218.     for(int i=0;i<a.m;i++){
  219.         for(int j=0;j<a.n;j++){
  220.             a.mass[i][j] = rand()%10;
  221.         }
  222.     }
  223. }
  224.  
  225. void show(matrix2d a){ // вывод на экран (хотя уже это реализовано оператором, хех)
  226.     for(int i=0;i<a.m;i++){
  227.         for(int j=0;j<a.n;j++){
  228.             cout<<a.mass[i][j]<<" ";
  229.         }
  230.         cout<<endl;
  231.     }
  232. }
  233. matrix2d Rs(matrix2d a,int k,int l){//функция, с помененнами местами столбиками (предыдущая функция определена в структуре, и просто меняет столбцы, здесь же создаётся новая матрица)
  234.     for (int i=0;i<a.m;i++){
  235.         swap(a.mass[i][k-1],a.mass[i][l-1]);
  236.     }
  237.     return a;
  238. }
  239.  
  240. int main()
  241. {
  242.     matrix2d d(3,3);
  243.     while (true){
  244.         manul(d);
  245.         cout<<det(d)<<" ";
  246.         cout<<perdet(d);
  247.     }
  248.     return 0;
  249. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement