当前位置: 首页 > 知识库问答 >
问题:

错误的结果使用自动与Eigen

岳阳文
2023-03-14

当两个向量求和时,我使用auto和Vector得到了不同的结果。

我的代码:

#include "stdafx.h"
#include <iostream>
#include "D:\externals\eigen_3_1_2\include\Eigen\Geometry"

typedef Eigen::Matrix<double, 3, 1>       Vector3;

void foo(const Vector3& Ha, volatile int j) 
{
    const auto resAuto = Ha + Vector3(0.,0.,j * 2.567);
    const Vector3 resVector3 = Ha + Vector3(0.,0.,j * 2.567);

    std::cout << "resAuto = " << resAuto <<std::endl;
    std::cout << "resVector3 = " << resVector3 <<std::endl;
}

int main(int argc, _TCHAR* argv[])
{
    Vector3 Ha(-24.9536,-29.3876,65.801);
    Vector3 z(0.,0.,2.567);

    int j = 7;

    foo(Ha,j);
    return 0;
}

结果是:

resAuto=-24.9536,-29.3876,65.801

resVector3=-24.9536,-29.3876,83.77

按任意键继续...

我知道Eigen会进行内部优化,从而产生不同的结果。但它看起来像是Eigen和C11中的一个bug。


共有1个答案

谯嘉胜
2023-03-14

auto关键字告诉编译器根据=的右侧“猜测”最佳对象。您可以通过添加

std::cout << typeid(resAuto).name() <<std::endl;
std::cout << typeid(resVector3).name() <<std::endl;

tofoo(别忘了包含

在这种情况下,在构造临时的Vector3之后,调用操作符方法,该方法创建CwiseBinaryOp对象。此对象是特征值惰性评估的一部分(可以提高性能)。如果您想要强制执行急切求值(从而确定类型),可以使用

const auto resAuto = (Ha + Vector3(0.,0.,j * 2.567)).eval();

而不是你在foo中的行。

一些附带说明:

  • Vector3与在Eigen
  • 中定义的Vector3d类相同

 类似资料:
  • 我在Anylogic模型中有数据库c2d\U自拾取: 我必须使用QueryDSL通过SCid和PVZid找到c2d_lm值: 如果我选择下一对: 我希望查询返回,其中一个值(行号8),但它返回7个值: 我做错了什么? 谢谢。

  • 我试图从我的数据库中得到一些数据,但我不会得到正确的结果。 我的方法: 所以应该有一个确切的结果,但我从控制台得到的全部是:日期的范围是从今天(6月12日-2周) CEST 2012年Tue Jun 12 14:49:11 2012年东部时间5月30日星期三14:49:11

  • 导入java.util.Scanner;公共类GroupActivity{公共静态void main()

  • 我使用Spring Redis和@Cacheable注释来实现两种方法。当我调用一个方法时,我会得到另一个方法的缓存结果。 当我使用@Cachebale注释为每个方法配置不同的缓存时,怎么可能从错误的缓存中得到结果? 安装:Spring版本4.1.6。Redis data 1.5和Redis client 2.7.0。 示例代码:

  • 我正在寻找变量的差异。当差异大于时,我希望将其标记为。以下是我尝试的: 为什么在这里被标记为?

  • 我试着从两个表中提取带有union的数据,并通过“created_at”DESC对它们进行排序- 代码: 我得到的查询是: 我希望得到的查询: 知道为什么吗? 我的laravel版本是:V4.2.8 相关主题:https://github.com/laravel/framework/pull/3901 谢谢你的帮助!