Eigen3的自动向量化和函数之间的传递

时间:2017-02-04 22:39:23

标签: c++ eigen eigen3

当A类通过Eigen :: Array成员的列时,Eigen3能否对该除法进行矢量化,另一个类B取列,然后用B的Eigen :: Array进行除法?

示例:

#include <Eigen/Dense>
class A_interface {
public:
    template <typename T>
    void div_by(const T& rhs);
    const auto col(const int col_id) const;
};
enum A_implementation { test };
template <A_implementation A_t> class A;

template <>
class A<test> : public A_interface{
public:
    A(const int n_rows, const int n_cols) 
            : _n_rows(n_rows), _n_cols(n_cols), 
              _data(n_rows, n_cols) {}
    const auto col(const int col_id) const { 
        return _data.col(col_id); 
    }
    template <typename T>
    void div_by(const T& rhs) {
        for (int i = 0; i < _n_cols; ++i) {
            _data.col(i) /= rhs.col(i);
        }
    }
private:
    const int _n_rows;
    const int _n_cols; 
    Eigen::ArrayXXf _data;
    template <A_implementation A_t> friend class A;
};
int main() {
    A<test> a(10,2);
    A<test> b(10,2);
    a.div_by(b);
}

我想这样做是因为并非A的所有实现都使用Eigen :: Array。

在这种情况下,是由Eigen3或编译器矢量化的div_by方法中的双循环?

1 个答案:

答案 0 :(得分:2)

如果两个数组都按列存储(默认为Eigen),则div_by将被矢量化。但是你为什么要对列进行循环?那么_data/=rhs呢?你为什么要存储_n_rows,n_cols?该信息已在_data