Нет.Ваши размеры не совпадают.Вы смешиваете 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;
}