我为我的问题的模糊标题道歉。我不知道更好的表达方式。我以前从未问过 Stack Overflow 问题,但这个问题让我完全难过。
类中的方法Chunk
使用 Eigen 线性代数库生成 vector3f,然后将其映射到具有以下内容的 C 样式数组。
ColPivHouseholderQR<MatrixXf> dec(f);
Vector3f x = dec.solve(b);
float *fit = x.data();
return fit;
该数组在主函数中返回和访问。但是,每当我尝试从指针中打印出一个值时,都会得到完全不同的结果。下面是一个示例。
Chunk test = Chunk(CHUNK_SIZE, 0, 0, 1, poBand);
float* fit = test.vector; // Should have size 3
std::cout << fit[0] << std::endl; // Outputs 3.05 (correct)
std::cout << fit[0] << std::endl; // Outputs 5.395e-43
std::cout << fit[0] << std::endl; // Outputs 3.81993e+08
使这个问题更加令人困惑的是,当我以“\n”或“,”结束行时,错误的值会发生变化。无论我打印索引 0、1 还是 2,第一个值始终是预期值。
我已经尝试为 fit 变量动态分配内存,以及在这个 answer上实现代码,但没有一个会改变这个功能。
预先感谢您对此问题的任何指导。
最小可重现示例:
float* getVector() {
Eigen::Vector3f x;
x << 3, 5, 9;
float* fit = x.data();
return fit;
}
int main(void) {
float* fit = getVector();
std::cout << fit[0] << std::endl;
std::cout << fit[0] << std::endl;
std::cout << fit[0] << std::endl;
}
您在堆栈上的函数中创建向量 x 。它在函数退出后被销毁。因此,您的指针无效。
这里有一个 shared_ptr 的例子
ColPivHouseholderQR<MatrixXf> dec(f);
Vector3f x = dec.solve(b);
shared_ptr<float> fit(new float[3],std::default_delete<float[]>());
memcpy(fit,x.data(),sizeof(float)*3);
return fit;
另一种可能的方式是
ColPivHouseholderQR<MatrixXf> dec(f);
Vector3f x = dec.solve(b);
return x;
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句