zoukankan      html  css  js  c++  java
  • 矩阵的基本运算


    #define MAX_MATLAB_N (128)


    void swap(double *a,double *b)
    {
     double tmp = *a;
     *a = *b;
     *b = tmp;
    }


    bool inv_matlab(double *p,int N)
    {

     int is[MAX_MATLAB_N] = {0};
     int js[MAX_MATLAB_N] = {0};
     
     int f = 1;
     double fDet = 1.0;

     for (int k=0; k<N; k++)
     {


      // 1.
      double tmp = 0.0;
      double fmax = 0.0;
      
      for (int i=k;i<N; i++)
      {
       for (int j=k; j<N; j++)
       {
        tmp = fabs(*(p + i*N + j));
        if (tmp > fmax)
        {
         fmax = tmp;
         is[k] = i;
         js[k] = j;
        }
       }
       
      }

      if ( (fmax + 1.0) == 1.0)
      {
       //没有逆阵
       printf("没有逆矩阵\n");
       return false;
      }

      if (is[k] != k)
      {
       f = -f;
       for (int i=0; i<N; i++)
       {
        //swap(p(k*N+i), p(is[k]*N+i));
        swap(p +(k*N+i), p +(is[k]*N+i) );
       }

      }

      if (is[k] != k)
      {
       f = -f;
       for (int i=0; i<N; i++)
       {
        swap(p +(i*N+k), p +(i*N+is[k]) );
       }

      }

      fDet *= p[k*N+k];
      
      // 2.
      p[k*N+k] = 1.0/p[k*N+k];

      // 3.
      for (int i=0; i<N; i++)
      {
       if (i!=k)
       {
        p[k*N+i] *= p[k*N+k];
       }
      }

      // 4
      
      for (int i=0; i<N; i++)
      {
       if (i!=k)
       {
        for (int j = 0; j<N; j++)
        {
         if (j!=k)
         {
          p[i*N+j] = p[i*N+j] - p[i*N+k] * p[k*N+j];
         }
        }
       }
      }

      // 5
      for (int i=0; i<N; i++)
      {
       if (i!=k)
       {
        p[i*N+k] *= -p[k*N+k];
       }
      }
     }

     for (int k=(N-1); k>=0; k--)
     {
      if (js[k] != k)
      {
       for (int i=0; i<N; i++)
       {
        swap(p +(k*N+i), p +(js[k]*N+i) );
       }

      }
      if (is[k] != k)
      {
       for (int i=0; i<N; i++)
       {
        swap(p +(i*N+k), p +(i*N+is[k]));
       }
      }

     }


     return true;
    }
    void tra_matlab(double *p, double *pOut, int N)
    {
     for (int i=0; i<N; i++)
     {
      for (int j=0; j<N; j++)
      {
       pOut[i*N + j] = p[j*N + i];
      }
     }
    }

    void add_matlab(double *p1,double *p2, double *pOut, int N)
    {
     for (int i=0; i<N; i++)
     {
      for (int j=0; j<N; j++)
      {
       pOut[i*N + j] = p1[i*N + j] + p2[i*N + j];
      }
     }

    }


    void dec_matlab(double *p1,double *p2, double *pOut, int N)
    {
     for (int i=0; i<N; i++)
     {
      for (int j=0; j<N; j++)
      {
       pOut[i*N + j] = p1[i*N + j] - p2[i*N + j];
      }
     }

    }
    void mul_matlab(double *p1,double *p2, double *pOut, int N)
    {
     for (int i=0; i<N; i++)
     {
      for (int j=0; j<N; j++)
      {
       double sum = 0.0;
       for (int m = 0; m<N; m++)
       {
        sum += p1[i*N + m]*p2[m*N + j];
       }

       pOut[i*N + j] = sum;
      }
     }
    }

    void mul_matlab(double *p1, int m1,int n1, double *p2, int m2,int n2, double *pOut)
    {

     if (n1 != m2)
     {
      printf("p1 的列数 必须等于 p2 的行数\n");

      return;
     }

     int m = m1;
     int n = n2;

     for (int i = 0; i<m; i++)
     {
      for (int j = 0; j<n; j++)
      {
       double sum = 0.0;

       for (int k = 0; k < n1; k++)
       {
        sum += p1[i*n1 + k] * p2[ k*n2 + j];
       }
       pOut[i*n + j] = sum;
      }
     }
    }

  • 相关阅读:
    June. 26th 2018, Week 26th. Tuesday
    June. 25th 2018, Week 26th. Monday
    June. 24th 2018, Week 26th. Sunday
    June. 23rd 2018, Week 25th. Saturday
    June. 22 2018, Week 25th. Friday
    June. 21 2018, Week 25th. Thursday
    June. 20 2018, Week 25th. Wednesday
    【2018.10.11 C与C++基础】C Preprocessor的功能及缺陷(草稿)
    June.19 2018, Week 25th Tuesday
    June 18. 2018, Week 25th. Monday
  • 原文地址:https://www.cnblogs.com/signal/p/2408167.html
Copyright © 2011-2022 走看看