我想在Eigen中重新创建Matlab重新缩放命令
https://www.mathworks.com/help/matlab/ref/rescale.html
我尝试翻译,但不确定。我的本征知识仍然太有限了...
auto rescale = [&](
Eigen::MatrixXd mat,
Eigen::VectorXd inmin,
Eigen::VectorXd inmax,
Eigen::VectorXd l,
Eigen::VectorXd u
) -> Eigen::MatrixXd {
auto val = l.array() + (
((mat - inmin).array()) / ((
((inmax - inmin).array()) * ((u - l).array())
).array())
);
return val;
};
这可行吗?
答案 0 :(得分:2)
不。您的尺寸不匹配。您正在混合ArrayXd
和ArrayXXd
。这更像您想要的,带有一个用于标量的版本和一个用于矢量的版本。调整rowwise
/ colwise
以匹配不同版本的Matlab rescale
。
#include <Eigen/Core>
#include <iostream>
int main()
{
auto rescale = [&](
Eigen::MatrixXd mat,
double l,
double u
) -> Eigen::MatrixXd {
double min = mat.minCoeff();
double max = mat.maxCoeff();
auto val = l + (mat.array() - min) * ((u - l) / (max - min));
return val;
};
Eigen::MatrixXd mat(4,4);
Eigen::Map<Eigen::VectorXd>(mat.data(), mat.size()).setLinSpaced(1, mat.size());
std::cout << mat << "\n\n";
auto rescaled = rescale(mat, 2, 5);
std::cout << rescaled << "\n\n";
auto rescale2 = [&](
Eigen::MatrixXd mat,
Eigen::VectorXd l,
Eigen::VectorXd u
) -> Eigen::MatrixXd {
Eigen::ArrayXd min = mat.colwise().minCoeff();
Eigen::ArrayXd max = mat.colwise().maxCoeff();
auto val = l.array().replicate(1, mat.cols())
+ ((mat.array().rowwise() - min.transpose()).rowwise() *
((u - l).array() / (max - min)).transpose());
return val;
};
Eigen::VectorXd mn, mx;
mn.resize(mat.cols());
mx.resize(mat.cols());
mn.setConstant(1.3);
mx << 2, 5, 6, 9;
rescaled = rescale2(mat, mn, mx);
std::cout << rescaled << "\n\n";
return 0;
}