我正在尝试计算Boost Ublas矩阵的所有元素的平方根。到目前为止,我有这个,它的确有效。
#include <iostream>
#include "boost\numeric\ublas\matrix.hpp"
#include <Windows.h>
#include <math.h>
#include <cmath>
#include <algorithm>
typedef boost::numeric::ublas::matrix<float> matrix;
const size_t X_SIZE = 10;
const size_t Y_SIZE = 10;
void UblasExpr();
int main()
{
UblasExpr();
return 0;
}
void UblasExpr()
{
matrix m1, m2, m3;
m1.resize(X_SIZE, Y_SIZE);
m2.resize(X_SIZE, Y_SIZE);
m3.resize(X_SIZE, Y_SIZE);
for (int i = 0; i < X_SIZE; i++)
{
for (int j = 0; j < Y_SIZE; j++)
{
m1(i, j) = 2;
m2(i, j) = 10;
}
}
m3 = element_prod(m1, m2);
std::transform(m1.data().begin(), m1.data().end(), m3.data().begin(), std::sqrtf);
for (int i = 0; i < X_SIZE; i++)
{
for (int j = 0; j < Y_SIZE; j++)
{
std::cout << m3(i, j) << " ";
}
std::cout << std::endl;
}
}
但是,我想不使用std :: transform,而是做类似这样的事情: m3 = sqrtf(m1);
有没有办法让它发挥作用?我的应用程序对性能非常敏感,因此只有在不影响效率的情况下才能接受替代方案。
P.S。我想为log10f,cos,acos,sin,asin,pow等很多其他操作做这个。我的代码中需要这些。
答案 0 :(得分:3)
您可以使用适当的签名定义自己的sqrt函数:
typedef boost::numeric::ublas::matrix<float> matrix;
matrix sqrt_element(const matrix& a)
{
matrix result(a.size1(), a.size2());
std::transform(a.data().begin(), a.data().end(), result.data().begin(), std::sqrtf);
return result;
}
您还可以定义一个通用的'apply_elementwise'来将可调用对象作为参数(未经测试/未编译):
typedef boost::numeric::ublas::matrix<float> matrix;
template <typename CALLABLE>
matrix apply_elementwise(const CALLABLE& f, const matrix& a)
{
matrix result(a.size1(), a.size2());
std::transform(a.data().begin(), a.data().end(), result.data().begin(), f);
return result;
}
然后您可以将其称为:
matrix y(apply_elementwise(std::sqrt, x));
matrix z;
z = apply_elementwise(std::cos, x);
在这些函数中,我们按值返回矩阵。理想情况下,您希望确保您使用的矩阵类使用rvalue-reference构造函数和赋值运算符来最小化数据复制。