元素最大值和特征值中的正部分

Element-wise max and positive part in Eigen

本文关键字:正部 特征值 最大值 元素      更新时间:2023-10-16

我想取Eigen中两个向量/矩阵的元素最大值。到目前为止,我已经编写了以下代码:

template <typename S, typename T>
auto elemwise_max(const S & A, const T & B) {
    return (A.array() > B.array()).select(A, B); 
}

这是正确的吗,还是有更好的方法?

对于积极的部分(即max(A, 0)),我不知道如何进行。我需要创建两种方法吗?

template <typename S>
auto positive_part_matrix(const S & A) {
   auto zeros = S::Zero(A.rows(), A.cols());
   return elemwise_max(A, zeros);
}
template <typename S>
auto positive_part_vec(const S & A) {
   auto zeros = S::Zero(A.size());
   return elemwise_max(A, zeros);
}

理想情况下,上述两者都将被称为positive_part

答案就在那里。

您可以移动到"阵列"世界并使用max:

A.array().max(B.array())

或使用cwiseMax:

A.cwiseMax(B)

在这两种情况下,B可以是Matrix或标量:

A = A.cwiseMax(0);

我想你要找的是

mat1.cwiseMax(mat2);

mat1.cwiseMax(0);

如文件所示

http://eigen.tuxfamily.org/dox/classEigen_1_1MatrixBase.html#aa1a53029c0ee62fb8875ce3c12151eda

它们还有一个数组接口。

http://eigen.tuxfamily.org/dox/classEigen_1_1ArrayBase.html#add2c757190d66c4d10d44b74c07a9e0f

如果你想对向量和标量/向量进行混合/最大比较,在Eigen中应该是:

  • 对于Max:
vector.cwiseMax(some_scalar); 
vector.cwiseMax(some_vector); 
  • 对于最小值:
vector.cwiseMin(some_scalar); 
vector.cwiseMin(some_vector);
  • 对于两者同时使用,例如饱和函数:
vector.cwiseMin(max_limit).cwiseMax(min_limit); 

但是,如果您想使用矩阵进行比较,我认为您需要分别对每一行/列执行上述操作。