gpt4 book ai didi

c++ - 跨 conservativeResize 将 ColXpr 维护为 MatrixXf

转载 作者:行者123 更新时间:2023-11-28 06:10:03 24 4
gpt4 key购买 nike

我正在尝试维护一个引用 Eigen::MatrixXf 跨保守调整大小的第一列的变量。

ColXpr c 看起来在 MatrixXf m 调整大小时无法重新分配时无效。我可以看到这如何保护我免受错误,但我不明白我应该怎么做才能让 c 给我新的 m 的第一列?

#include <iostream>
#include <Eigen/Dense>

int main()
{
Eigen::MatrixXf m = Eigen::MatrixXf::Random(4,2);
Eigen::MatrixXf::ColXpr c = m.col(0);

std::cout << m << std::endl;
// 0.680375 0.823295
// -0.211234 -0.604897
// 0.566198 -0.329554
// 0.59688 0.536459
std::cout << c << std::endl;
// 0.680375
// -0.211234
// 0.566198
// 0.59688

m.conservativeResize(3, Eigen::NoChange);

std::cout << m << std::endl;
// 0.680375 0.823295
// -0.211234 -0.604897
// 0.566198 -0.329554
std::cout << c << std::endl;
// 1.4013e-45
// 0
// 1.4013e-45
// 0


c = m.col(0); // <<<<< This cores with the Eigen Warning
// Assertion `rows() == other.rows() && cols() == other.cols()' failed.

std::cout << c << std::endl;
return EXIT_SUCCESS;
}

最佳答案

ColXpr 这样的特征表达式类型旨在用作临时变量,在一行中构建和销毁。它们的主要目的是避免不必要的复制——在 ColXpr 的情况下,通过对原始数组的数据进行别名。

别名是一个实现细节,而不是面向用户的功能。您不应该依赖 ColXpr 进行更新,即使您只是修改原始矩阵,更不用说调整它的大小了。

如果您想要始终提供矩阵第一列的东西,那就是 m.col(0)。如果愿意,您可以将其包装在一个函数中。

关于c++ - 跨 conservativeResize 将 ColXpr 维护为 MatrixXf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31457072/

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