c++ - 对 Matrix<> 或 Block<> 执行数组操作的特征函数
问题描述
我想做一个可以同时接受 Matrix<> 或 Block<> 对象的函数。
例子:
#include <iostream>
#include <Eigen/Dense>
//A simplified example of the function I'm making
double example_function(const Eigen::MatrixXd & input){
double d1 = input.array().pow(2).sum();
double d2 = input.rowwise().norm().sum();
return d1 + d2;
}
int main(){
Eigen::MatrixXd m1(3,2);
m1.setRandom();
// This works
example_function(m1);
// I'd like to make this work
example_function(m1.block(1,0,2,2));
return 0;
}
以下不起作用,因为 DenseBase 没有 'array' 方法:
template<typename Derived>
double example_function(const Eigen::DenseBase<Derived> & input){
double d1 = input.array().pow(2).sum(); // array() method invalid
double d2 = input.rowwise().norm().sum();
return d1 + d2;
}
我该怎么办?
解决方案
首先,您的原始代码(带有const MatrixXd&
)确实有效,但它会生成不必要的副本。要通过模板函数同时接受Matrix<...>
和对象,请使用代替:Block<Matrix<...> >
MatrixBase
DenseBase
template<class Derived>
double example_function(const Eigen::MatrixBase<Derived> & input){
double d1 = input.array().abs2().sum(); // abs2() is simpler/more efficient than pow(2)
double d2 = input.rowwise().norm().sum();
return d1 + d2;
}
但是,在您的示例代码m1.block(1,0)
中是无效的,因为您需要指定大小以及起始索引,例如,这些工作:
m1.block<1,2>(1,0);
m1.block(1,0, 1,2);
并且m1.Random()
应该是m1.setRandom()
。
推荐阅读
- python - 从运行不同 python 版本的系统激活 virtualenv
- xml - 如何使用 ForEach-Object 将项目添加到我的数组
- amazon-web-services - 如何在运行 kops update cluster ${NAME} --yes 时修复“找不到“kope.io/k8s ...”的图像
- angularjs - process.nextTick 不是新 MicrophoneStream (microphone-stream.js:114) 中的函数,位于 identifyMicrophone (recognize-microphone.js:107)
- php - Laravel 多个路由参数
- api - 有没有办法在 Azure-DevOps Build Pipeline 中异步运行命令行?
- eyeshot - 如果(Mesh or Brep)的面是平面,如何得到它的法线向量
- cakephp-3.0 - 无法使用 $this->set('data', array received from find()) 将数组从控制器传递到 cakephp 3 中查看
- spring-boot - 将类路径中的外部 jar 添加到可执行 WAR 文件
- gitlab - 在 gitlab 上运行的 newman 超时,出现 503