特征 - 连接矩阵作为参考

时间:2016-11-19 00:45:13

标签: c++ eigen

以下代码将1的向量连接到矩阵:

['a'], ['bc', 'bb'], ['dsa'], ['defe']

该函数将X的内容复制到Y.如何定义函数以避免复制并返回对包含using Eigen::VectorXd; using Eigen::MatrixXd; MatrixXd cbind1(const Eigen::Ref<const MatrixXd> X) { const unsigned int n = X.rows(); MatrixXd Y(n, 1 + X.cols()); Y << VectorXd::Ones(n), X; return Y; } 的矩阵的引用?

感谢。

1 个答案:

答案 0 :(得分:3)

如果您已经关注并阅读了ggael对您的previous question的回答(看起来您已经接受了答案),那么您就会阅读this page文档。通过略微修改示例,您可以编写为MCVE

的一部分
#include <iostream>
#include <Eigen/Core>

using namespace Eigen;

template<class ArgType>
struct ones_col_helper {
    typedef Matrix<typename ArgType::Scalar,
        ArgType::SizeAtCompileTime,
        ArgType::SizeAtCompileTime,
        ColMajor,
        ArgType::MaxSizeAtCompileTime,
        ArgType::MaxSizeAtCompileTime> MatrixType;
};

template<class ArgType>
class ones_col_functor
{
    const typename ArgType::Nested m_mat;

public:
    ones_col_functor(const ArgType& arg) : m_mat(arg) {};

    const typename ArgType::Scalar operator() (Index row, Index col) const {
        if (col == 0) return typename ArgType::Scalar(1);
        return m_mat(row, col - 1);
    }
};

template <class ArgType>
CwiseNullaryOp<ones_col_functor<ArgType>, typename ones_col_helper<ArgType>::MatrixType>
cbind1(const Eigen::MatrixBase<ArgType>& arg)
{
    typedef typename ones_col_helper<ArgType>::MatrixType MatrixType;
    return MatrixType::NullaryExpr(arg.rows(), arg.cols()+1, ones_col_functor<ArgType>(arg.derived()));
}

int main()
{
    MatrixXd mat(4, 4);
    mat << 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16;

    auto example = cbind1(mat);

    std::cout << example << std::endl;
    return 0;
}