Я пытаюсь выполнить экспоненцию матрицы, но я не хочу копировать/вставлять мою функцию экспоненции и скорее использовать шаблоны классов. Проблема в том, что для матриц форсирования, для умножения матриц, вы используете функцию prod
(вместо operator*
).Как передать функцию prod() матрицы boost как функцию умножения?
Похоже, что g ++ не может определить шаблон, который я хочу использовать. Ошибка я получаю с ниже код
41:37: error: no matching function for call to 'my_pow(boost::numeric::ublas::matrix<int>&, int, <unresolved overloaded function type>)'
вот код:
#include <iostream>
using namespace std;
#include <boost/numeric/ublas/matrix.hpp>
#include <boost/numeric/ublas/io.hpp>
typedef long long int64;
template <class T, class M> T my_pow(T b, int64 e, M mult)
{
if (e == 1) return b;
if (e % 2 == 1) return mult(b, my_pow(b, e - 1, mult));
T tmp = my_pow(b, e/2, mult);
return mult(tmp, tmp);
}
template <class T> T my_pow(T b, int64 e) { return my_pow(b, e, multiplies<T>()); }
int main()
{
using namespace boost::numeric::ublas;
matrix<int> m(3, 3);
for (unsigned i = 0; i < m.size1(); ++i)
for (unsigned j = 0; j < m.size2(); ++j)
m(i, j) = 3 * i + j;
std::cout << m << std::endl;
std::cout << my_pow(m, 2, prod) << std::endl;
}
Есть ли способ передать тычок() для my_pow поэтому шаблон решает? Благодарю.
Это случае это не ясно: б является основой, е является показателем, и my_pow является вычислением Ь^E
Благодаря тонну. Дал вам верх, но я оказался независимо тем же решением, что и dhavenith, поэтому дал ему чек. Несмотря на то, что он делает предположения о типах возврата, я думаю, что это простительно, учитывая сложность более общей обертки, которую вы представили. Кто-нибудь еще чувствует, что форсированный способ слишком часто компромиссен? – Brian
и upvote для поиска 'matrix_matrix_binary_traits'. – dhavenith