【问题标题】:Eigen boolean array slicing特征布尔数组切片
【发布时间】:2013-04-27 14:44:34
【问题描述】:

在 MATLAB 中,通常会从矩阵/数组(称为 logical indexing)中切出满足某些条件的值。

vec = [1 2 3 4 5];
condition = vec > 3;
vec(condition) = 3;

如何在 Eigen 中执行此操作?到目前为止,我有:

Eigen::Matrix<bool, 1, 5> condition = vec.array() > 3;

【问题讨论】:

标签: c++ matlab matrix slice eigen


【解决方案1】:

试试this:

#include <iostream>
#include <Eigen/Dense>

int main()
{
    Eigen::MatrixXi m(1, 5);
    m << 1, 2, 3, 4, 5;
    m = (m.array() > 3).select(3, m);
    std::cout << m << std::endl;

    return 0;
}

【讨论】:

  • @srsci:你是什么意思?上面的例子运行良好,它实际上是直接从文档中提取出来的......
  • 实际上,对于给定的问题(即值的上限),只需 m.cwiseMin(3) 即可工作(通常更快)。
【解决方案2】:

正如在此处对类似问题的回答中指出的那样:Submatrices and indices using Eigen,libigl 将此功能添加到 Eigen。

igl::slice(A,indices,B);

相当于

B = A(indices)

【讨论】:

  • 虽然它可能有用,但它并没有回答这里的问题。 OP 要求相当于 MATLAB 的 A(A&gt;3)=3,而不是如何提取子矩阵......我展示的解决方案基本上是一个元素三元运算符,相当于:m(i) = (m(i) &gt; 3) ? 3 : m(i)
  • 浏览文档igl::slice_into 是更接近的匹配项,但据我所知,它仅适用于索引列表,而不适用于逻辑向量......甚至他们的 MATLAB- to-eigen/igl 转换表建议使用Eigen::selectlibigl.github.io/libigl/matlab-to-eigen.html(参见A(B == 0) = C(B==0) 语句)。
猜你喜欢
  • 1970-01-01
  • 2020-11-25
  • 2016-04-11
  • 1970-01-01
  • 2023-04-05
  • 2017-09-14
  • 1970-01-01
  • 2012-11-10
  • 2017-04-04
相关资源
最近更新 更多