我是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
任何人都可以向我解释这个吗?这是一个错误吗?还是打算?如果我使用自动?
,教师返回的实际数据类型是什么?答案 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 expression
,random vector expression
或fixed sized random matrix or vector expression
。 Random()