Квадратные матрицы

Для квадратной матрицы 2-го порядка определены: заполнение матрицы указанным значением, вычисление детерминанта, операторы умножения и взятия обратной матрицы.
template <class T> class Matrix2
{
public:
    T aa, ab,
      ba, bb;

    Matrix2 & set ( const T & v )
    {
        aa = ab =
        ba = bb = v;
        return *this;
    }

    Def<Matrix2> operator ~ () const
    {
        SLU2<T> slu;
        slu.matrix() = *this;
        slu.ac = 1; slu.bc = 0;
        Def<Matrix2> m;
        if ( ! slu.gauss ( m.aa, m.ba ) ) return m;
        slu.ac = 0; slu.bc = 1; 
        m.isDef = slu.gauss ( m.ab, m.bb );
        return m;
    }

    T determinant() const
    {
        return aa * bb - ab * ba;
    }
};

template <class T> Matrix2<T> operator * ( const Matrix2<T> & l, const Matrix2<T> & r )
{
    Matrix2<T> m;
    m.aa = l.aa * r.aa + l.ab * r.ba; m.ab = l.aa * r.ab + l.ab * r.bb;
    m.ba = l.ba * r.aa + l.bb * r.ba; m.bb = l.ba * r.ab + l.bb * r.bb;
    return m;
}
Для квадратной матрицы 3-го порядка определены: заполнение матрицы указанным значением и вычисление детерминанта.
template <class T> class Matrix3
{
public:
    T aa, ab, ac,
      ba, bb, bc,
      ca, cb, cc;

    Matrix3 & set ( const T & v )
    {
        aa = ab = ac = 
        ba = bb = bc = 
        ca = cb = cc = v;
        return *this;
    }

    T determinant() const
    {
        return  ( ab * bc - ac * bb ) * ca +
                ( ac * ba - aa * bc ) * cb +
                ( aa * bb - ab * ba ) * cc;
    }
};
Симметричная квадратная матрица 3-го порядка.
template <class T> class SymMatrix3
{
public:
    T aa, ab, ac,
      bb, bc,
      cc;

    SymMatrix3 & set ( const T & v )
    {
        aa = ab = ac =
        bb = bc =
        cc = v;
        return *this;
    }

    T determinant() const
    {
        return  ( ab * bc - ac * bb ) * ac +
                ( ac * ab - aa * bc ) * bc +
                ( aa * bb - ab * ab ) * cc;
    }
};
Для квадратной матрицы 4-го порядка определены: заполнение матрицы указанным значением и вычисление детерминанта.
template <class T> class Matrix4
{
public:
    T aa, ab, ac, ad,
      ba, bb, bc, bd,
      ca, cb, cc, cd,
      da, db, dc, dd;

    Matrix4 & set ( const T & v )
    {
        aa = ab = ac = ad =
        ba = bb = bc = bd =
        ca = cb = cc = cd =
        da = db = dc = dd = v;
        return *this;
    }

    T determinant() const
    {
        Matrix3<T> m;
        T a, b, c;
        const double ma = qmod ( ad );
        const double mb = qmod ( bd );
        const double mc = qmod ( cd );
        const double md = qmod ( dd );
        if ( md >= mc && md >= mb && md >= ma )
        {
            if ( dd == 0 ) return 0;
            a = da / dd;
            b = db / dd;
            c = dc / dd;
            m.aa = aa - a * ad;   m.ab = ab - b * ad;   m.ac = ac - c * ad;
            m.ba = ba - a * bd;   m.bb = bb - b * bd;   m.bc = bc - c * bd;
            m.ca = ca - a * cd;   m.cb = cb - b * cd;   m.cc = cc - c * cd;
            return dd * m.determinant();
        }
        if ( mc >= mb && mc >= ma )
        {
            a = ca / cd;
            b = cb / cd;
            c = cc / cd;
            m.aa = aa - a * ad;   m.ab = ab - b * ad;   m.ac = ac - c * ad;
            m.ba = ba - a * bd;   m.bb = bb - b * bd;   m.bc = bc - c * bd;
            m.ca = da - a * dd;   m.cb = db - b * dd;   m.cc = dc - c * dd;
            return -cd * m.determinant();
        }
        if ( mb >= ma )
        {
            a = ba / bd;
            b = bb / bd;
            c = bc / bd;
            m.aa = aa - a * ad;   m.ab = ab - b * ad;   m.ac = ac - c * ad;
            m.ba = ca - a * cd;   m.bb = cb - b * cd;   m.bc = cc - c * cd;
            m.ca = da - a * dd;   m.cb = db - b * dd;   m.cc = dc - c * dd;
            return bd * m.determinant();
        }
        else
        {
            a = aa / ad;
            b = ab / ad;
            c = ac / ad;
            m.aa = ba - a * bd;   m.ab = bb - b * bd;   m.ac = bc - c * bd;
            m.ba = ca - a * cd;   m.bb = cb - b * cd;   m.bc = cc - c * cd;
            m.ca = da - a * dd;   m.cb = db - b * dd;   m.cc = dc - c * dd;
            return -ad * m.determinant();
        }
    }
};

Исходники находятся в файле LinAlg.h.

Наверх