itmo.ru aco.ifmo.ru https://visionlab.itmo.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); } /////////////////////////////////////////////////////////////////////////////

1.3. Пример чтения и записи дерева параметров в xml

Другой полезный пример - запись и чтение дерева параметров в xml.

Пример записи:

#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/xml_parser.hpp>
using namespace boost::property_tree;

// запись параметров в xml
void Save(double dOS_Focus, double dOS_FNumber, double dShutter)
{
    // создаем основное дерево
    ptree oTree;
    // параметры объектива
    ptree oLens;
    oLens.put("Фокусное_расстояние_[мм]", dOS_Focus);
    oLens.put("Диафрагменное_число", dOS_FNumber);
    oTree.add_child("Параметры_объектива", oLens);
    // параметры съемки
    ptree oCamera;
    oCamera.put("Выдержка_[мс]", dShutter);
    oTree.add_child("Параметры_съемки", oCamera);
    //запись в файл
    std::ofstream fout("camera.xml");
    const xml_writer_settings<std::string> settings(' ', 4);
    write_xml(fout, oTree, settings);
}

Пример чтения:

#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/xml_parser.hpp>

using namespace boost::property_tree;

// чтение параметров из xml
void Load(double &dOS_Focus, double &dOS_FNumber, double &dShutter)
{
    // чтение параметров из xml
    std::ifstream fin("camera.xml");
    ptree oTree;
    read_xml(fin, oTree);
    // параметры объектива
    ptree oLens = oTree.get_child("Параметры_объектива");
    dOS_Focus = oLens.get<double>("Фокусное_расстояние_[мм]");
    dOS_FNumber = oLens.get<double>("Диафрагменное_число");
    // параметры съемки
    ptree oCamera = oTree.get_child("Параметры_съемки");
    dShutter = oCamera.get<double>("Выдержка_[мс]");
}

Результат записи в xml: