我可以将特征定义变量与函数 adjacent_difference 一起使用吗?
Can I use Eigen-defined variable with the function adjacent_difference?
所有,提前感谢您的任何意见和建议!
我用C++的Eigen-library定义了一个double数组,然后我想使用C++的Numeric-library的adjacent_difference,我发现我不能为定义的变量使用那个函数在特征库下。
是不是两个库有冲突?基本上,我想使用 Eigen 库的 LinSpaced 函数和 Numeric 库的 adjacent_difference 函数。当然,我更喜欢在代码中保留 Eigen-library。
//not use Eigen defined variables
double a[] = { 1,3,4,7 }, b[4];
adjacent_difference(a,a+4,b);
for (int i = 0; i < 4; i++)
cout << b[i] << endl;
//use Eigen defined variables
ArrayXd a1(4), b1(4);
a1 << 1, 3, 4, 7;
adjacent_difference(a1, a1 + 4, b1);
for (int i = 0; i < 4; i++)
cout << b1[i] << endl;
报错信息显示"no instance of overloaded function matches the argument list".
首先,利用Eigen的built-in功能,可以很方便的计算相邻差,例如:
void adjacent_diff_eigen(Eigen::ArrayXf const& A, Eigen::ArrayXf& B)
{
Eigen::Index n = A.size();
B.resize(n);
if(n == 0) return;
B[0] = A[0];
B.tail(n-1) = A.tail(n-1) - A.head(n-1);
}
与 std
方法相反,这也应该被矢量化(除非未对齐矢量化被禁用)。
此外,通过 Eigen 的开发分支,您还可以像这样使用 std-like 迭代器:
void adjacent_diff_std(Eigen::ArrayXf const& A, Eigen::ArrayXf& B)
{
B.resizeLike(A);
std::adjacent_difference(A.begin(), A.end(), B.begin());
}
对于旧的 Eigen 版本,您可以通过直接访问数据来解决问题:
std::adjacent_difference(A.data(), A.data()+A.size(), B.data());
Live-Demo 在 godbolt:https://godbolt.org/z/qbkagM
所有,提前感谢您的任何意见和建议!
我用C++的Eigen-library定义了一个double数组,然后我想使用C++的Numeric-library的adjacent_difference,我发现我不能为定义的变量使用那个函数在特征库下。
是不是两个库有冲突?基本上,我想使用 Eigen 库的 LinSpaced 函数和 Numeric 库的 adjacent_difference 函数。当然,我更喜欢在代码中保留 Eigen-library。
//not use Eigen defined variables
double a[] = { 1,3,4,7 }, b[4];
adjacent_difference(a,a+4,b);
for (int i = 0; i < 4; i++)
cout << b[i] << endl;
//use Eigen defined variables
ArrayXd a1(4), b1(4);
a1 << 1, 3, 4, 7;
adjacent_difference(a1, a1 + 4, b1);
for (int i = 0; i < 4; i++)
cout << b1[i] << endl;
报错信息显示"no instance of overloaded function matches the argument list".
首先,利用Eigen的built-in功能,可以很方便的计算相邻差,例如:
void adjacent_diff_eigen(Eigen::ArrayXf const& A, Eigen::ArrayXf& B)
{
Eigen::Index n = A.size();
B.resize(n);
if(n == 0) return;
B[0] = A[0];
B.tail(n-1) = A.tail(n-1) - A.head(n-1);
}
与 std
方法相反,这也应该被矢量化(除非未对齐矢量化被禁用)。
此外,通过 Eigen 的开发分支,您还可以像这样使用 std-like 迭代器:
void adjacent_diff_std(Eigen::ArrayXf const& A, Eigen::ArrayXf& B)
{
B.resizeLike(A);
std::adjacent_difference(A.begin(), A.end(), B.begin());
}
对于旧的 Eigen 版本,您可以通过直接访问数据来解决问题:
std::adjacent_difference(A.data(), A.data()+A.size(), B.data());
Live-Demo 在 godbolt:https://godbolt.org/z/qbkagM