繁体   English   中英

在Matrix <>或Block <>上执行数组操作的本征函数

[英]Eigen function that does array operations on Matrix<> or 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没有'a​​rray'方法,因此以下操作无效

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()

如果两种对象都支持您希望执行的操作,则:

template <typename T>
double example_function(const T& input){
    double d1 = input.array().pow(2).sum();
    double d2 = input.rowwise().norm().sum();
    return d1 + d2;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM