|
|||||
|
| |||||
1. Описание работы с библиотекой BoostВ разделе приводится пример использования свободно распространяемая библиотека uBLAS из состава набора библиотек Boost www.boost.org. 1.1. Установка и подключение библиотеки
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; 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:
|