Eigen3随机矩阵在使用auto时会更改值

时间:2018-01-10 06:16:06

标签: c++ matrix eigen

我是Eigen3的新手。我正在尝试用它作为一种练习来编写一个简单的神经网络。由于我想要使用模型的精度,我使用auto来声明我的变量。这是一个例子,

auto inp = MatrixXf::Random(4,10);

这是我用来初始化神经网络输入的那一行。但这行代码给我带来了很多麻烦。这让我整整一个下午意识到这是不正确的。每当我调用它时,矩阵内的值都会改变!!!!!!!!!!!!

这是一个用于查看情况的小代码示例。

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

using Eigen::MatrixXf;
using Eigen::VectorXf;
using Eigen::ArrayXXf;

int main()
{

    auto inp = MatrixXf::Random(4,10);
    auto exp_oup = MatrixXf::Random(4,5);

    std::cout<<inp<<std::endl<<std::endl;
    std::cout<<exp_oup<<std::endl<<std::endl;

    std::cout<<"Wait!!!!"<<std::endl<<std::endl;

    std::cout<<inp<<std::endl<<std::endl;
    std::cout<<exp_oup<<std::endl<<std::endl;

    return 0;

}

我的输出如下

[JDIP@localhost Eigen]$ ./eigen
    0.680375   0.823295  -0.444451  -0.270431   0.271423  -0.967399  -0.686642   0.997849    0.22528  -0.012834
 -0.211234  -0.604897    0.10794  0.0268018   0.434594  -0.514226  -0.198111  -0.563486  -0.407937    0.94555
    0.566198  -0.329554 -0.0452059   0.904459  -0.716795  -0.725537  -0.740419  0.0258648   0.275105  -0.414966
     0.59688   0.536459   0.257742    0.83239   0.213938   0.608353  -0.782382   0.678224  0.0485743   0.542715

 0.0534899  -0.433371  -0.860489  -0.615572  -0.871657
    0.539828  -0.295083   0.898654   0.326454  -0.959954
 -0.199543   0.615449  0.0519907   0.780465 -0.0845965
    0.783059   0.838053  -0.827888  -0.302214  -0.873808

Wait!!!!

 -0.52344 -0.466668 0.0250708 -0.124725 -0.431413  0.375723  0.658402  -0.29928  0.314608 -0.203127
 0.941268 0.0795207  0.335448   0.86367  0.477069 -0.668052 -0.339326   0.37334  0.717353  0.629534
 0.804416 -0.249586 0.0632129   0.86162  0.279958 -0.119791 -0.542064  0.912936  -0.12088  0.368437
    0.70184  0.520497 -0.921439  0.441905 -0.291903   0.76015  0.786745   0.17728   0.84794  0.821944

-0.0350187   -0.70468   0.239193  -0.105933   0.112888
    -0.56835   0.762124  -0.437881  -0.547787  -0.166997
    0.900505   0.282161   0.572004  -0.624934  -0.660786
    0.840256  -0.136093  -0.385084  -0.447531   0.813608

任何人都可以向我解释这个吗?这是一个错误吗?还是打算?如果我使用自动

,教师返回的实际数据类型是什么?

2 个答案:

答案 0 :(得分:2)

documentation中所述:

  

返回
      随机矩阵表达式

表达式不是矩阵,而是&#34;占位符&#34;可以在以后评估。这用于惰性评估。有关在Eigen中使用auto,请参阅common pitfalls

答案 1 :(得分:1)

根据Eigen的文件:

  

执行摘要:Eigen具有智能编译时机制,可以在适当的情况下启用延迟评估和删除临时值。在大多数情况下,它会自动处理混叠,例如使用矩阵产品。可以使用MatrixBase :: eval()和MatrixBase :: noalias()方法手动覆盖自动行为。

Eigen:docs:lazy eval & aliasing

简单地说; Eigen具有智能机制,可以知道何时使用延迟评估,何时不知道。

示例:

// In this example:
matrix1 = matrix2 + matrix3;
// Eigen chooses lazy evaluation over immediate evaluation(producing a temporary)


// In this example:
matrix1 = matrix2 * matrix3;
// Since the order of operation of the matrix operands are important due
// to how matrix multiplication works; Eigen will evaluate immediately and
// store the results into a temporary then copy it back into the variable
// assignment.

由于Eigen是基于表达式模板的库,因此建议使用关键字auto,可以在此处看到:

  

C ++ 11和自动关键字

     

简而言之:不要将自动关键字与Eigen的表达式一起使用,除非您100%确定自己在做什么。特别是,请勿使用auto关键字替代Matrix&lt;&gt;类型。

有关自动关键字Eigen:docs:common pitfalls的示例和说明。

而是尝试这样做:

MatrixXf inp     = MatrixXf::Random(4,10);
MatrixXf exp_oup = MatrixXf::Random(4,5);

Random(...)方法取决于使用它的上下文,可以返回random matrix expressionrandom vector expressionfixed sized random matrix or vector expressionRandom()