itmo.ru aco.ifmo.ru c-visionlab.ru
вернуться в оглавление предыдущая глава предыдущий параграф следующий параграф следующая глава


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

В разделе приводится пример использования свободно распространяемая библиотека uBLAS из состава набора библиотек Boost www.boost.org.

1.1. Установка и подключение библиотеки

  • Скачать архив с официального сайта boost и разархивировать его, например, в папку C:/lib/boost_1_84_0.
  • Для работы с библиотекой в Visual Studio:
    • в разделе "Свойства конфигурации -> Каталоги VC++" добавить в "Каталоги включения"
      C:/lib/boost_1_84_0.
    • либо добавить в CMakeLists.txt строку:
      include_directories("C:/lib/boost_1_80_0")
  • Для работы с библиотекой в Qt Creator необходимо в файле проекта (*.pro) добавить строку:
    INCLUDEPATH += [полный путь к boost].
    Например INCLUDEPATH += C:/lib/boost_1_84_0.

1.2. Пример работы с матрицами

В библиотеке есть много полезных функций, рассмотрим например, работу с матрицами.

    // создание матрицы (пустой конструктор)
    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); 

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

Стандартными средствами библиотеки 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); } /////////////////////////////////////////////////////////////////////////////