计算 Eigen::Matrix 的 sign() 的最佳方法
Best way to compute sign() of Eigen::Matrix
由于 Eigen C++ 库不包含用于计算矩阵 sign(x)
的内置方法,因此我正在寻找执行此操作的最佳方法。有关 sign()
的定义,请参阅 Matlab documentation,尽管我并不真的需要 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
但是我想知道是否有更好的方法来做到这一点?创建两个临时矩阵看起来很麻烦,并且在处理非常大的矩阵时会变得相当慢。
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;
}
怎么样
X = X.array().sign();
由于 Eigen C++ 库不包含用于计算矩阵 sign(x)
的内置方法,因此我正在寻找执行此操作的最佳方法。有关 sign()
的定义,请参阅 Matlab documentation,尽管我并不真的需要 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
但是我想知道是否有更好的方法来做到这一点?创建两个临时矩阵看起来很麻烦,并且在处理非常大的矩阵时会变得相当慢。
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;
}
怎么样
X = X.array().sign();