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

Eigen3's autovectorization and pass between functions

当一个 class A 传递一个 Eigen::Array 成员的列,另一个 class 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。

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

div_by 如果两个数组都存储 column-wise(Eigen 中的默认值),将被矢量化。但是你为什么要在列上循环? _data/=rhs 呢?为什么要存储 _n_rows,n_cols?信息已经在 _data.