计算Eigen :: Matrix的sign()的最佳方法

时间:2016-01-08 11:19:06

标签: c++ math matrix eigen

由于Eigen C ++库不包含用于计算矩阵的sign(x)的内置方法,因此我正在寻找执行此操作的最佳方法。有关sign()的定义,请参阅139 steps,尽管我并不需要0个元素的情况。我想出的方法如下。

Eigen::MatrixXf a = Eigen::MatrixXf(2,2);
a << -0.5, 1.0,
      0.3, -1.4;

// Temporary objects containing 1's and -1's
const Eigen::MatrixXi pos = Eigen::MatrixXi::Ones(a.rows(), a.cols());
const Eigen::MatrixXi neg = Eigen::MatrixXi::Ones(a.rows(), a.cols()) * -1;

// Actually filling of the matrix sign(a)
Eigen::MatrixXi a_sign = (a.array() >= 0).select(pos, neg);

std::cout << a << std::endl << std::endl;
std::cout << a_sign << std::end;

这样可以输出

-0.5    1
 0.3 -1.4

-1  1
 1 -1

但是我想知道是否有更好的方法呢?创建两个临时矩阵似乎很麻烦,在处理非常大的矩阵时会变得相当慢。

2 个答案:

答案 0 :(得分:2)

unaryExpr怎么样?

double sign_func(double x)
{
    if (x > 0)
        return +1.0;
    else if (x == 0)
        return 0.0
    else
        return -1.0;
}

int main()
{
     Eigen::MatrixXf a = Eigen::MatrixXf(2,2);
     a << -0.5, 1.0,
           0.3, -1.4;
     std::cout << a.unaryExpr(std::ptr_fun(sign_func)) << std::endl;
     return 0;
}

答案 1 :(得分:1)

怎么样

 X = X.array().sign();