特征等效于Matlab cescale命令

Eigen equivalent of Matlab rescale command

本文关键字:cescale 命令 Matlab 特征      更新时间:2023-10-16

我想在eigen

中重新创建matlab cescale命令

https://www.mathworks.com/help/matlab/ref/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;
  };

这是否可行?

no。您的尺寸不匹配。您正在混合ArrayXdArrayXXd。这更像是您想要的,带有标量的版本,另一个用于向量。调整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 << "nn";
    auto rescaled = rescale(mat, 2, 5);
    std::cout << rescaled << "nn";
    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 << "nn";

    return 0;
}