c++ - Eigen 广播比较

标签 c++ templates eigen

在 Eigen 中,我们可以比较两个数组的分量。我们也可以使用 broadcasting将(适当大小的) vector 添加到矩阵。然而,这两者并没有以明显的方式结合起来以允许行/列比较操作。例如

#include <iostream>
#include <Eigen/Core>

using namespace std;
using namespace Eigen;

using vect_t = Matrix<double, 1, 3>;
using matr_t = Matrix<double, 5, 3>;

int main()
{
    vect_t l(0.1,0.1,0.1);
    vect_t u(0.3,0.3,0.3);
    matr_t X;
    X << 0.0, 0.0, 0.0,
         0.1, 0.2, 0.1,
         0.2, 0.2, 0.2,
         1.0, 0.0, 0.2,
         0.2, 0.4, 0.4;

    auto Y = l.array() < u.array(); // okay, gives [1, 1, 1]
    auto Z = X.array().rowwise() + l.array();
    // okay, gives
    // 0.1, 0.1, 0.1,
    // 0.2, 0.3, 0.2,
    // 0.3, 0.3, 0.3,
    // 1.1, 0.1, 0.3,
    // 0.3, 0.5, 0.5;

    //auto W = X.array().rowwise() < l.array(); // does not compile
    // would expect (via broadcasting) something like 
    // 1, 1, 1,
    // 0, 0, 0,
    // 0, 0, 0,
    // 0, 1, 0,
    // 0, 0, 0

    cout << X << endl << endl;
    cout << Y << endl << endl;
    cout << Z << endl << endl;
    //cout << W << endl << endl;

    return 0;
}

如何实现这种逐行比较?

评论:在我看来,它应该可以很好地工作。只是尚未实现的情况还是我遗漏了什么?

最佳答案

每当 rowwise()colwise() 不起作用时,您可以使用 replicate .在你的情况下:

auto W = X.array() < l.array().replicate(X.rows(), 1);

auto W = X.array() < l.array().colwise().replicate(X.rows());

关于c++ - Eigen 广播比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44394715/

相关文章:

c++ - C/C++代码的编码和命名约定测试

c++ - 非常量引用绑定(bind)到临时的 Visual Studio 错误?

javascript - 保留元素的 JS 模板引擎

c++ - Boost 容器无法使用未定义(但已声明)的类进行编译

c++ - 处理 Eigen 中两种存储布局的固定大小矩阵的连续 vector

c++ - Eigen,如何访问 MatrixBase<Derived> 的底层数组

c++ - 为什么 getline(cin, string_name) 在我第一次在循环中使用它时会创建一个空字符串?

c++ - 如何在 Qt 程序中实现 IDv3 标签?

c# - 使用语句实现与 C# 等效的 C++

c++ - 在 C++ 中使用 eigen3 进行继承和转换