Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> добавление метода в ublas 
:(
    Опции темы
iff
Дата 28.4.2014, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Администратор
**


Профиль
Группа: Участник
Сообщений: 949
Регистрация: 23.3.2007

Репутация: нет
Всего: 16



На сайте boost есть функция для вычисления обратной матрицы в ublas.
Код

 namespace ublas = boost::numeric::ublas;

 template<class T>
 bool InvertMatrix (const ublas::matrix<T>& input, ublas::matrix<T>& inverse) {
    using namespace boost::numeric::ublas;
    typedef permutation_matrix<std::size_t> pmatrix;
    // create a working copy of the input
    matrix<T> A(input);
    // create a permutation matrix for the LU-factorization
    pmatrix pm(A.size1());
    // perform LU-factorization
    int res = lu_factorize(A,pm);
        if( res != 0 ) return false;
    // create identity matrix of "inverse"
    inverse.assign(ublas::identity_matrix<T>(A.size1()));
    // backsubstitute to get the inverse
    lu_substitute(A, pm, inverse);
    return true;
 } 

Как ее правильно оформить в виде метода matrix? При этом сам этот класс уже определен в другом фале, и там исправлять я бы ничего не хотел. Вот не рабочий вариант
Код

template<class T, class L, class A>
class ublas::matrix : public
 ublas::matrix inverse (const ublas::matrix& input) {
    using namespace boost::numeric::ublas;
    typedef permutation_matrix<std::size_t> pmatrix;
    // create a working copy of the input
    matrix A(input);
    // create a permutation matrix for the LU-factorization
    pmatrix pm(A.size1());
    // perform LU-factorization
    int res = lu_factorize(A,pm);
        if( res != 0 ) return NULL;
    // create identity matrix of "inverse"
        matrix output(identity_matrix(A.size1()));
    // backsubstitute to get the inverse
    lu_substitute(A, pm, output);
    return output;
 }

они используют также иногда конструкцию <self_type>, видимо здесь нужно писать identity_matrix<self_type>; т.к. когда matrix, то выражение для шаблона автоматически подставляется, а здесь класс по-другому называется и нужно написать что подставить в шаблон.


--------------------
DOS... Синей пеленой экран заполнил чистый DOS 
Мышь... Стала вдруг квадратной, потеряла форму мышь... 
Я разбил окно, девяностопятое мастдайное окно, 
И поставил DOS, и тогда увидел: Это счастье, — вот оно.  
PM MAIL WWW   Вверх
xvr
Дата 29.4.2014, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(iff @  28.4.2014,  21:11 Найти цитируемый пост)
Как ее правильно оформить в виде метода matrix?

Никак. С++ не позволяет добавлять в класс метод вне описания самого класса. Но можно сделать наследника от ublas::matrix<T> и определить метод в нем.

PM MAIL   Вверх
iff
Дата 29.4.2014, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Администратор
**


Профиль
Группа: Участник
Сообщений: 949
Регистрация: 23.3.2007

Репутация: нет
Всего: 16



Спасибо. Реализовал как обычную функцию. А можно ли сделать ее внутри пространства имен boost::numeric::ublas, или тоже вне его описания нельзя?

Это сообщение отредактировал(а) iff - 29.4.2014, 18:27


--------------------
DOS... Синей пеленой экран заполнил чистый DOS 
Мышь... Стала вдруг квадратной, потеряла форму мышь... 
Я разбил окно, девяностопятое мастдайное окно, 
И поставил DOS, и тогда увидел: Это счастье, — вот оно.  
PM MAIL WWW   Вверх
xvr
Дата 29.4.2014, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(iff @  29.4.2014,  18:27 Найти цитируемый пост)
А можно ли сделать ее внутри пространства имен boost::numeric::ublas,

Это можно

PM MAIL   Вверх
iff
Дата 27.5.2014, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Администратор
**


Профиль
Группа: Участник
Сообщений: 949
Регистрация: 23.3.2007

Репутация: нет
Всего: 16



Добавляю таким способом функции вычисления векторного произведения и cross_matrix. (для векторов размерности 3)
Код

#include <boost/numeric/ublas/vector.hpp>
#include <boost/numeric/ublas/matrix.hpp>

namespace boost { namespace numeric { namespace ublas {

template<class T>
matrix<T> cross_matrix(const vector<T> v) {
  matrix<T> M(3, 3);
  M(0, 0) = 0;     M(0, 1) = -v(2); M(0, 2) = v(1);
  M(1, 0) = v(2);  M(1, 1) = 0;     M(1, 2) = -v(0);
  M(2, 0) = -v(1); M(2, 1) = v(0);  M(2, 2) = 0;
  return M;
};

template<class T>
vector<T> cross_prod(const vector<T> v1, const vector<T> v2) {
  vector<T> c(3);
  c(0) = v1(1) * v2(2) - v1(2) * v2(1);
  c(1) = v1(2) * v2(0) - v1(0) * v2(2);
  c(2) = v1(0) * v2(1) - v1(1) * v2(0);
  return c;
};

}}};

Но если вызвать например cross_prod с e_z:
Код

const unit_vector<float> e_z(3, 2);

то происходит ошибка: no instance of function template "boost::numeric::ublas::cross_prod" matches the argument list.
Как правильно объявлять аргументы функций для ublas?
cross_matrix выдаёт косо-симметричную матрицу. Есть ли для таких специальный тип (контейнер)?


--------------------
DOS... Синей пеленой экран заполнил чистый DOS 
Мышь... Стала вдруг квадратной, потеряла форму мышь... 
Я разбил окно, девяностопятое мастдайное окно, 
И поставил DOS, и тогда увидел: Это счастье, — вот оно.  
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0941 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.