Как вставить элемент в матрицу убласа с динамическим размером

Ошибка времени выполнения при попытке вставить элемент в матрицу с размером, не указанным изначально.

Приведенный ниже код запускает finr для m1, но выдает ошибку для м2.

#include <iostream>
#include <boost/numeric/ublas/matrix.hpp>
#include <boost/numeric/ublas/io.hpp>

int main () {
boost::numeric::ublas::matrix<double> m1 (1,1);
boost::numeric::ublas::matrix<double> m2;
unsigned int i = 0;
m1(i,i)=9;  // This works completely
m2(i,i)=9;  // This one throws error
return 0;
}

Если кто-то может предоставить альтернативу для достижения этого, я буду очень признателен.

2

Решение

Как вы уже заметили, boost::numeric::ublas::matrix не меняет себя автоматически, как std::vector, Вы должны сделать изменение размера вручную перед вызовом operator()или напишите шаблон функции, который выполнит для вас изменение размера, как показано здесь:

namespace ublas = boost::numeric::ublas; //just a friendly alias!

template<typename T, typename U>
void assign(ublas::matrix<T>& m,std::size_t r,std::size_t c,U const& data)
{
m.resize(std::max(m.size1(), r+1), std::max(m.size2(), c+1));
m(r, c) = data;
}

Теперь вы можете сделать это:

int main ()
{
ublas::matrix<double> m;

assign(m, 0, 0, 9);  //m(0,0) = 9;
assign(m, 3, 2, 20); //m(3,2) = 20

std::cout << m << std::endl; //prints: [4,3]((9,0,0),(0,0,0),(0,0,0),(0,0,20))
return 0;
}

Онлайн демо

Надеюсь, это поможет.

2

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector