Matlab rescale 命令的 Eigen 等价物
Eigen equivalent of Matlab rescale command
我想在 Eigen 中重新创建 Matlab 重新缩放命令
https://www.mathworks.com/help/matlab/ref/rescale.html
我试过翻译但不太确定。我的Eigen知识还是太有限了...
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;
};
这可行吗?
没有。你的尺寸不匹配。您正在混合 ArrayXd
和 ArrayXXd
。这更像是您想要的,一个版本用于标量,另一个版本用于向量。调整 rowwise
/colwise
以匹配不同版本的 matlabs 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;
}
我想在 Eigen 中重新创建 Matlab 重新缩放命令
https://www.mathworks.com/help/matlab/ref/rescale.html
我试过翻译但不太确定。我的Eigen知识还是太有限了...
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;
};
这可行吗?
没有。你的尺寸不匹配。您正在混合 ArrayXd
和 ArrayXXd
。这更像是您想要的,一个版本用于标量,另一个版本用于向量。调整 rowwise
/colwise
以匹配不同版本的 matlabs 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;
}