给定一个实数c
向量和一个整数向量rw
,我想创建一个带有元素z
的向量z_i=c_i^rw_i
。我尝试使用组件式函数pow
来完成此操作,但是我遇到了编译器错误。
#include <Eigen/Core>
typedef Eigen::VectorXd RealVector;
typedef Eigen::VectorXi IntVector; // dynamically-sized vector of integers
RealVector c; c << 2, 3, 4, 5;
IntVector rw; rw << 6, 7, 8, 9;
RealVector z = c.pow(rw); **compile error**
编译器错误是
error C2664: 'const Eigen::MatrixComplexPowerReturnValue<Derived> Eigen::MatrixBase<Derived>::pow(const std::complex<double> &) const': cannot convert argument 1 from 'IntVector' to 'const double &'
with
[
Derived=Eigen::Matrix<double,-1,1,0,-1,1>
]
c:\auc\sedanal\LammSolve.h(117): note: Reason: cannot convert from 'IntVector' to 'const double'
c:\auc\sedanal\LammSolve.h(117): note: No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
这段代码有什么问题?并且,假设它可以修复,当c是真实矩阵而不是向量时,我将如何进行相同的操作,为c的所有元素计算c_ij^b_i
?
编译器是Visual Studio 2015,在64位Windows 7下运行。
答案 0 :(得分:2)
首先,MatrixBase::pow
是计算方阵矩阵幂的函数(如果矩阵具有特征值分解,则它是相同的矩阵,但特征值增加到给定的幂)。
你想要的是一个元素方面的权力,由于cwisePow
中没有MatrixBase
函数,因此需要切换到Array
- 域。此外,没有幂的整数特化(这可能是有效的,但只能达到某个阈值 - 并且检查每个元素的阈值会浪费计算时间),因此您需要将指数强制转换为类型你的矩阵。
还要回答你的奖金问题:
#include <iostream>
#include <Eigen/Core>
int main(int argc, char **argv) {
Eigen::MatrixXd A; A.setRandom(3,4);
Eigen::VectorXi b = (Eigen::VectorXd::Random(3)*16).cast<int>();
Eigen::MatrixXd C = A.array() // go to array domain
.pow( // element-wise power
b.cast<double>() // cast exponents to double
.replicate(1, A.cols()).array() // repeat exponents to match size of A
);
std::cout << A << '\n' << b << '\n' << C << '\n';
}
基本上,这会针对每个C(i,j) = std::pow(A(i,j), b(i))
,i
调用j
。如果你的所有指数都很小,那么你实际上可能比a更快
简单的嵌套循环调用专门的pow(double, int)
实现(如gcc&#39; s __builtin_powi
),但您应该将其与实际数据进行基准测试。