我发现boost :: ublas不能很好地支持逐个元素的操作和操作(但效率很高:))我试图
D = A ^ 2.*B ^ 3.*C.
其中A,B,C都是相同大小的方形矩阵,运算符".*"表示逐个元素的运算,^是矩阵的幂.有了提升:ublas,我写道
for (int n=0; n<300; n++)
{
for (int k=0; k<300; k++)
{
D(n, k) = pow(abs(A(n, k)), 2)*pow(abs(B(n, k)), 3)*C(n, k);
}
}
Run Code Online (Sandbox Code Playgroud)
在我的程序中,我有许多后续操作,如上所示,无论如何,我可以得到相同的结果,但使用一行代码而不是循环?
另外,我观察到为矩阵或向量的所有元素分配常量似乎无效
boost :: numeric :: ublas :: vector v(100); v = 0.2;
相反,我必须使用循环再次执行赋值,更好的方法来保存一些代码?我的算法很长,并且有很多繁琐的操作,如上所述.我尝试了另一个数字库Armadillo,它提供了简单操作的好方法,但它目前没有假设稀疏矩阵(在运行我的代码时会花费大约10倍).
您可以轻松地将常量分配给向量或矩阵:
vector<double> v = scalar_vector<double>(100, 0.2);
Run Code Online (Sandbox Code Playgroud)
常规向量(但不是 c_vector 或有界_向量)甚至有一个构造函数:
vector<double> v(100, 0.2);
Run Code Online (Sandbox Code Playgroud)
至于元素操作,您也可以轻松定义自己的操作,它只是样板代码,例如绝对功率:):
namespace boost { namespace numeric { namespace ublas {
template<class M, class P>
struct scalar_power:
public scalar_binary_functor<M, P> {
typedef typename scalar_binary_functor<M, P>::argument1_type argument1_type;
typedef typename scalar_binary_functor<M, P>::argument2_type argument2_type;
typedef typename scalar_binary_functor<M, P>::result_type result_type;
static BOOST_UBLAS_INLINE
result_type apply (argument1_type t1, argument2_type t2) {
return pow(abs(t1), t2);
}
};
template<class M, class P>
BOOST_UBLAS_INLINE
typename enable_if< is_convertible<P, typename M::value_type>,
typename matrix_binary_scalar2_traits<M, const P, scalar_power<typename M::value_type, P> >::result_type
>::type
operator ^ (const matrix_expression<M> &m,
const P &p) {
typedef typename matrix_binary_scalar2_traits<M, const P, scalar_power<typename M::value_type, P> >::expression_type expression_type;
return expression_type (m(), p);
}
}}}
Run Code Online (Sandbox Code Playgroud)
之后你的表达变成:
D = element_prod(A^2, element_prod(B^3, C));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1250 次 |
| 最近记录: |