我正在使用 Eigen 库执行以下操作。给定一个矩阵
M
和一个向量 x
,我想将 M
的每一行逐元素提升到 x
次幂。也就是说,如果M = [[10, 20], [20, 30], [30, 40], [40, 50]]
和x = [2, 3]
,我想得到[[100, 8000], [400, 27000], [900, 64000], [1600, 125000]]
的结果。有没有一种方法可以使用 Eigen 的 SIMD 功能并且无需任何显式 for 循环来实现此目的?
我尝试了以下代码
VectorXd func(const Ref<const Matrix<double,Dynamic,Dynamic,RowMajor>>& M, VectorXd x) {
auto retval = M.array().pow(x.array());
return retval;
}
但是,对于上述
M
和x
的值,该函数的返回值为[100, 8000]
。我也尝试过 M.array().rowwise().pow(x.array())
但我收到“错误:没有名为‘pow’的成员......”。我错过了什么?
当您调用
M.array().pow(x.array())
时,对于 M
和 x
的每个对应元素,它将 M
的每个元素提升到 x
的对应元素。这就是为什么您只得到预期结果的前两个元素。它不会将 M
的每一行与向量 x
相乘。
以下是修改函数的方法:
MatrixXd func(const Ref<const Matrix<double,Dynamic,Dynamic,RowMajor>>& M, VectorXd x) {
auto retval = M.array().rowwise().pow(x.transpose().array().replicate(M.rows(),1));
return retval;
}
x.transpose().array().replicate(M.rows(),1)
创建一个矩阵,其中每一行都是向量 x
,然后 M.array().rowwise().pow(...)
将 M
的每一行提升到该矩阵的相应行。