gpt4 book ai didi

c++ - Matlab rescale 命令的 Eigen 等价物

转载 作者:行者123 更新时间:2023-11-30 03:16:41 24 4
gpt4 key购买 nike

我想在 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;
};

这可行吗?

最佳答案

没有。你的尺寸不匹配。您正在混合使用 ArrayXdArrayXXd。这更像是您想要的,一个版本用于标量,另一个版本用于 vector 。调整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;
}

关于c++ - Matlab rescale 命令的 Eigen 等价物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56116182/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com