Вернуться наверх
aco.ifmo.ru photonic
вернуться в оглавление предыдущая глава предыдущий параграф следующий параграф следующая глава


Описание работы с библиотекой Boost::uBLAS и вычисления обратной матрицы

Подробно работа с матрицами и метод наименьших квадратов разбирается в лабораторной работе №2.

Описание работы с библиотекой Boost

В данной работе для операций с матрицами используется свободно распространяемая библиотека uBLAS из состава набора библиотек Boost.

Версия Boost 1.55.0, версия для Visual Studio 2019.

Документация по библиотеке uBLAS 1.55.0 на официальном сайте www.boost.org..

Документация по библиотеке uBLAS 1.32.0 на русском языке.

Установка библиотеки

  • Для работы с библиотекой в Visual Studio необходимо скопировать папку "boost" в папку включаемых файлов. Если вы не изменяли настройки Visual Studio по-умолчанию, то путь к папке включаемых файлов: C:/Program Files/Microsoft Visual Studio 14.0/VC/include.
  • Для работы с библиотекой в Qt Creator необходимо в файле проекта (*.pro) добавить строку:
    INCLUDEPATH += [полный путь к boost].
    Например INCLUDEPATH += C:/Qt/lib/.

Вычисление обратной матрицы

Стандартными средствами библиотеки uBLAS обращения матрицы не реализовано, но можно использовать вычисление обратной матрицы, сделанное на ее основе. Для этого скопируйте в папку с вашим проектом файл inverse.h .

Пример

/////////////////////////////////////////////////////////////////////////////
// Тест: проверка работы библиотеки boost
// 
// Кафедра Прикладной и компьютерной оптики, http://aco.ifmo.ru
// Университет ИТМО
/////////////////////////////////////////////////////////////////////////////
#include <iostream>

#include "boost/numeric/ublas/matrix.hpp"
#include "boost/numeric/ublas/vector.hpp"
using namespace boost::numeric::ublas;

#include "inverse.h"
//////////////////////////////////////////////////////////////////////////////
// вывод на экран матрицы 2х2
void print_matrix_2_2(const std::string& sText, boost::numeric::ublas::matrix<double> a)
{
    std::cout<<sText<<std::endl;
    std::cout<<a(0,0)<<" "<<a(0,1)<<std::endl;
    std::cout<<a(1,0)<<" "<<a(1,1)<<std::endl<<std::endl;    
}
/////////////////////////////////////////////////////////////////////////////
void main()
{
    // Начальная инициализация матрицы a
    boost::numeric::ublas::matrix<double> a(2,2);
    a(0,0)=1.;
    a(0,1)=2.;
    a(1,0)=3.;
    a(1,1)=4.;
    print_matrix_2_2("a:", a);

    // матрица b - единичная
    boost::numeric::ublas::matrix<double> b(2,2);
    b(0,0)=1.;
    b(0,1)=0.;
    b(1,0)=0.;
    b(1,1)=1.;
    print_matrix_2_2("b:", b);

    // перемножение двух матриц
    boost::numeric::ublas::matrix<double> c = prod(b, a);
    print_matrix_2_2("c=a*b:", c);

    // результат обращения матрицы a записан в матрицу b
    bool flag = false;
b=gjinverse<double>(a, flag);
print_matrix_2_2("b=invert a:", b); // перемножение матрицы a и обратной ей матрицы = единичная матрица c = prod(b, a); print_matrix_2_2("c=b*a:", c); } /////////////////////////////////////////////////////////////////////////////

Примеры использования матричных операций

    // создание матрицы (пустой конструктор)
    boost::numeric::ublas::matrix<double> A;
    // изменение размеров матрицы (значение существующих элементов сохраняются)
    A.resize(3,3);
    // создание матрицы с заданными размерами 
    boost::numeric::ublas::matrix<double> B(3,3), C(3,3);
    // кол-во строк матрицы
    int i=A.size1(); 
    // кол-во столбцов матрицы
    int j=A.size2();

    

    // сложение и вычитание матриц (сложение и вычитание векторов – аналогично)
    C = A + B; 
    C = A - B; 
    C = -A;
    C += A; 
    C -= A; 
    
    // умножение/деление матрицы на число ( умножение/деление вектора на число – аналогично)
    double x;
    C = x * A; 
    C = A * x; 
    C = A / x;
    C *= x; 
    C /= x; 
    
    // произведение матриц и векторов
    boost::numeric::ublas::vector<double> v(3), w;
    w = prod(A, v); 
    w = prod(v, A); 
    C = prod(A, B); 
    
    // транспонирование матрицы 
    C = trans(A);