我想在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
。
答案 0 :(得分:8)
答案是there。
您可以移至"array" world并使用max:
A.array().max(B.array())
或使用cwiseMax:
A.cwiseMax(B)
在这两种情况下,B
可以是Matrix
或标量:
A = A.cwiseMax(0);
答案 1 :(得分:3)
我认为你在寻找的是
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
答案 2 :(得分:0)
如果要对向量和标量/向量进行混合/最大值比较,则本征为:
vector.cwiseMax(some_scalar);
vector.cwiseMax(some_vector);
vector.cwiseMin(some_scalar);
vector.cwiseMin(some_vector);
vector.cwiseMin(max_limit).cwiseMax(min_limit);
但是,如果要使用矩阵进行比较,我认为您需要对每个行/列分别执行上述操作。