如何在C++中使用Eigen将矩阵M每行的每个元素求向量x每个元素的幂?

问题描述 投票:0回答:1

我正在使用 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’的成员......”。我错过了什么?

c++ eigen
1个回答
0
投票

当您调用

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
的每一行提升到该矩阵的相应行。

© www.soinside.com 2019 - 2024. All rights reserved.