Войти
ПрограммированиеСтатьиОбщее

ЧАВО по матрицам и кватернионам (3 стр)

Автор:

Определитель и обратная матрица

Что такое определитель матрицы?

Определитель матрицы это число, которое показывает, есть ли у матрицы обратная или нет. Если определитель равен 0, то обратной матрицы нет, иначе обратная матрица существует.

К примеру, есть матрица из одного элемента: \(M=\( m_{0,0} \). Для матрицы такого размера, определитель это просто значение одного элемента.
 
А, обратная матрица: \(M^{-1}=\( \frac 1{m_{0,0}} \).

Если элемент, а соответственно и определитель, не равен 0, то обратная матрица существует.

В случае единичной матрицы ее значение будет 1/1 или 1.0
 
Однако, если это число 0, то и определитель тоже 0.
 
При попытке найти обратное от нуля, получаем бесконечность. Так делать нельзя, так что для 0 не существует обратной матрицы.

Для единичной матрицы определитель всегда равен 1. Все матрицы с определителем равным единице называют изотропными.

Поэтому все матрицы вращения изотропны, так как определитель всегда равен 1.0.

Что можно доказать так:
\(M=\(\matrix{A&B\cr C&D}\)=\(\matrix{cos(x)&-sin(x)\cr sin(x) & cos(x)}\)
\(D = AD - BC\)
\(D = (cos(x)*cos(x)) - (-sin(x)*sin(x))\)
\(D=cos^2(x)+sin^2(x)\)
но мы знаем, что:
\(cos^2(x)+sin^2(x)=1\)
Так что\(D = 1\)

Как мне посчитать определитель матрицы?

  Определитель матрицы считается при помощи правила Крамера,
  где каждое число может быть рассчитано
  через разбиение матрицы в более малые матрицы.

  Для 2х2 матрицы М, определитель В считается так:
\(M=\(\matrix{A&B \cr C&D }\)
\(D = AD - BC\)

  Для матриц размером 3х3 и 4х4, найти определитель сложнее,
  но все равно можно при помощи методов типа правила Крамера.
 

Что такое изотропная и анизотропная матрицы?

Изотропной матрицей называют матрицу, в которой сумма квадратов всех трех строк или колонок равна 1.

Матрицы, в которой это не происходит, называется Анизотропной.

Матрицы используются для того, чтобы поворачивать и скалировать объект, иногда может быть необходимо, увеличивать или сжимать по одной оси сильнее, чем по другим.

К примеру, в сейсмических задачах, необходимо увеличить ось Z на 50 или более, при этом оси X и Y нужно оставить неизменными.

Другим примером может служить «раздавливание» и «растягивание» в анимации персонажей. Когда персонаж ударяет тяжелый предмет типа наковальни, то необходим эффект, при котором персонаж растягивается в стороны и сдавливается вертикально:

Матрица будет выглядеть так:

\(M=\(\matrix{ 2 & 0 & 0 & 0 \cr 0 & 2 & 0 & 0 \cr 0 & 0 & 0.5 & 0 \cr 0 & 0 & 0 & 1}\)

Однако здесь появляется проблема. В то время как не будет проблем с обработкой вершин, мы получим неправильное освещение, из-за кривых нормалей.

На шаге обработки данных, трансформация, выраженная данной матрицей Изменит как вершины, так и нормали.

После такого умножения, все нормали перестанут быть нормализованными, что подействует на освещение и обратное отсечение.

Что такое обратная матрица?

Дана матрица \(M^{-1}\), то обратная матрица этой матрицы, записывается как M, это матрица должна удовлетворять условию:

\(M \times M^{-1}=I\)

где I единичная матрица.

Так что, в результате умножения матрицы на обратную к ней будет единичная матрица. Однако матрица должна удовлетворять нескольким условиям, перед тем как обратная матрица будет посчитана.

Во-первых, ширина и высота матрицы должны совпадать, во-вторых ее определитель не должен равняться 0.

Расчет обратной матрицы необходим для  реализации обратной кинематики с помощью сплайнов.

Как мне посчитать обратную матрицу?

В зависимости от размера матрицы, расчет обратной может быть простым или очень сложным.

К примеру, обратная 1х1 матрица это просто обратная от одного элемента:

\(M=\( x \)

Обратная матрица:

\(M^{-1}=\( \frac 1x \).

Решение 2х2 матриц и больших может быть получено при использовании правила Крамера или через решение системы уравнений.

Однако, для конкретных случаев, таких как единичная матрица или матрицы поворота, обратная матрица сразу известна или может быть получена транспонированием.

Как мне посчитать обратную матрицу от единичной матрицы?

Обратная единичной матрицы и есть единичная матрица.
\(I*I^{-1} = I\)
  У любой единичной матрицы определитель всегда равен 1.
 

Как мне посчитать обратную от матрицы вращения?

  Так как определитель матрицы вращения равен 1,
  то расчет обратной матрицы равен транспонированию.

  Альтернативно, если известны углы поворота, то можно взять их с минусом,
  для расчета новой матрицы вращения.
 

Как мне посчитать обратную матрицу при помощи правила Крамера?

  Дана 3x3 матрица M:
\(M=\(\matrix{A&B&C \cr D&E&F \cr G&H&I }\)
  То ее определитель считается так:
\(detM=sum_{i=1}^n M*submat_{0,i}M*-1^{i}\)
  где:

  
    подмат   M - матрица собранная из всех строк и колонок матрицы M
          ij
  без строки i и колонки j. подмат    может вызываться рекурсивно.
                                  i,j
               
  Если определитель не равен 0, обратная матрица существует.

  В этом случае, значение каждого элемента можно определить так:

                                
     -1      1                            i+j
    M    = -----  *  det подмат     M * -1
     j,i   det M               i,j

Как мне посчитать обратную от 2х2 матрицы?

  Для матриц 2х2, расчет несколько сложнее. Если матрицы определена так:

        | A B |
    M = |     |
        | C D |
                               
  То определитель равен:
    det = AD - BC
  И обратная задается так:
     -1    1   |  D  -B  |
    M  =  ---  |         |
           det | -C   A  |
  Это можно доказать используя правило Крамера. Дана матрица M:
        | A B |
    M = |     |
        | C D |
  Ее определитель равен:
                           0                            1
    det =  M    * подмат M    * -1 +  M    * подмат M    * -1
            0,0           0,0          0,1           0,1

    <=>    M    * M    * 1         +  M    * M    * -1
            0,0    1,1                 0,1    1,0

    <=>    A  * D                  +  B    * C    * -1

    <=>    AD                      +  BC . -1

    <=>    AD - BC
    ==============


  И обратная делается так:

     -1                      0+0      -1
    M    = det submat    * -1    <=> M    = M    *  1 <=> D
     0,0             0,0              0,0    1,1

     -1                      1+0      -1
    M    = det submat    * -1    <=> M    = M    * -1 <=> C * -1
     0,1             1,0              0,1    1,0

     -1                      0+1      -1
    M    = det submat    * -1    <=> M    = M    * -1 <=> B * -1
     1,0             0,1              1,0    0,1

     -1                      1+1      -1
    M    = det submat    * -1    <=> M    = M    *  1 <=> A
     1,1             1,1              1,1    0,0
  То обратная матрица равна:
     -1    1  |  D  -C |
    M   = --- |        |
          det | -B   A |
  Если ее определитель не равен 0.

Как мне посчитать обратную от 3х3 матрицы?


 
  Для матриц 3х3 и больше, обратная считается с помощью правила Крамера
  или через решение системы линейных уравнений.

  Если правило Крамера применить к матрице М:

      | A B C |
    M = | D E F |
        | G H I |
 
  То ее опеделитель считается так:
    det M = A * (EI - HF) - B * (DI - GF) + C * (DH - GE)
  Если определитель не равен 0, то обратная считается так:
     -1     1     |   EI-FH  -(BI-HC)   BF-EC  |
    M   = ----- . | -(DI-FG)   AI-GC  -(AF-DC) |
          det M   |   DH-GE  -(AH-GB)   AE-BD  |

  Это можно реализовать с помощью пары Сишных функций:
     
    VFLOAT m3_det( MATRIX3 mat )
      {
      VFLOAT det;

      det = mat[0] * ( mat[4]*mat[8] - mat[7]*mat[5] )
          - mat[1] * ( mat[3]*mat[8] - mat[6]*mat[5] )
          + mat[2] * ( mat[3]*mat[7] - mat[6]*mat[4] );

      return( det );
      }

   ----------------------------------

   void m3_inverse( MATRIX3 mr, MATRIX3 ma )
     {
     VFLOAT det = m3_det( ma );

     if ( fabs( det ) < 0.0005 )
       {
       m3_identity( ma );
       return;
       }

     mr[0] =    ma[4]*ma[8] - ma[5]*ma[7]   / det;
     mr[1] = -( ma[1]*ma[8] - ma[7]*ma[2] ) / det;
     mr[2] =    ma[1]*ma[5] - ma[4]*ma[2]   / det;

     mr[3] = -( ma[3]*ma[8] - ma[5]*ma[6] ) / det;
     mr[4] =    ma[0]*ma[8] - ma[6]*ma[2]   / det;
     mr[5] = -( ma[0]*ma[5] - ma[3]*ma[2] ) / det;

     mr[6] =    ma[3]*ma[7] - ma[6]*ma[4]   / det;
     mr[7] = -( ma[0]*ma[7] - ma[6]*ma[1] ) / det;
     mr[8] =    ma[0]*ma[4] - ma[1]*ma[3]   / det;
     }

Как мне посчитать обратную 4х4 матрицы?

Также как с матрицами 3х3, нужно применить правило Крамера или решить линейные уравнения.

  Эффективно будет использовать уже описанные Сишные функции,
  которые использовались при расчете обратной к 3х3 матрице.

  Чтобы реализовать правило Крамера для матриц 4х4, необходимо выделить
  отдельные подматрицы. Это достигается при помощи следующей функции:
 

     void m4_submat( MATRIX4 mr, MATRIX3 mb, int i, int j )
      {
      int ti, tj, idst, jdst;

      for ( ti = 0; ti < 4; ti++ )
        {
        if ( ti < i )
          idst = ti;
        else
          if ( ti > i )
            idst = ti-1;

        for ( tj = 0; tj < 4; tj++ )
          {
          if ( tj < j )
            jdst = tj;
          else
            if ( tj > j )
              jdst = tj-1;

          if ( ti != i && tj != j )
            mb[idst*3 + jdst] = mr[ti*4 + tj ];
          }
        }
      }
 
  Определитель матрицы 4х4 может быть расчитан так:
 
    VFLOAT m4_det( MATRIX4 mr )
      {
      VFLOAT  det, result = 0, i = 1;
      MATRIX3 msub3;
      int     n;

      for ( n = 0; n < 4; n++, i *= -1 )
        {
        m4_submat( mr, msub3, 0, n );

        det     = m3_det( msub3 );
        result += mr[n] * det * i;
        }

      return( result );
      }

  Обратная матрица может быть рассчитана так:
 

      int m4_inverse( MATRIX4 mr, MATRIX4 ma )
      {
      VFLOAT  mdet = m4_det( ma );
      MATRIX3 mtemp;
      int     i, j, sign;

      if ( fabs( mdet ) < 0.0005 )
        return( 0 );

      for ( i = 0; i < 4; i++ )
        for ( j = 0; j < 4; j++ )
          {
          sign = 1 - ( (i +j) % 2 ) * 2;

          m4_submat( ma, mtemp, i, j );

          mr[i+j*4] = ( m3_det( mtemp ) * sign ) / mdet;
          }

      return( 1 );
      }
  Очень полезно иметь функции, которые могут рассчитать

  обратную любой 4х4 матрицы. Их применение включает возможность посчитать
  основную матрицу для сплайнов, обратить вращение и
  перестроить матричные уравнения.
 

Как мне посчитать обратную матрицу с помощью линейных уравнений?

  Если есть матрица M:

         | A B C |
    M  = | D E F |
         | G H I |
  то есть обратная матрица:
         | P Q R |
    M' = | S T U |
         | V W X |
  и верно следующее выражение:
                     -1
        M     .     M     = I

    | A B C |   | P Q R |   | 1 0 0 |
    | D E F | . | S T U | = | 0 1 0 |
    | G H I |   | V W X |   | 0 0 1 |
  Обратная может быть рассчитана через решение системы линейных уравнений:
  
    | AP + BS + CV |   | 1 |   Колонка 0 (X)
    | DP + ES + FV | = | 0 |
    | GP + HS + IV |   | 0 |

    | AQ + BT + CW |   | 0 |   Колонка 1 (Y)
    | DQ + ET + FW | = | 1 |
    | GQ + HT + IW |   | 0 |

    | AR + BU + CX |   | 0 |   Колонка 2 (Z)
    | DR + EU + FX | = | 0 |
    | GR + HU + IX |   | 1 |

Страницы: 1 2 3 4 5 6 Следующая »

#C++, #OpenGL, #кватернионы, #математика, #матрицы

9 марта 2011 (Обновление: 25 мая 2020)

Комментарии [40]

Заказ пиццы ивантеевка pushpizza.ru/ivanteevka.