Eigen - matrix.transpose 会创建矩阵的副本吗?
Eigen - does matrix.transpose create a copy of the matrix?
我想使用特征做以下矩阵积:
Eigen::VectorXd vector = Eigen::VectorXd::Random(1000000); // a given long vector
Eigen::MatrixXd product = vector * vector.transpose();
我不确定 Eigen 在调用vector.transpose()
或只是视图时会创建矢量的副本。我通过创建一个向量及其转置然后修改原始向量的值来尝试:
Eigen::VectorXd vector(3);
vector << 1, 2, 3;
Eigen::VectorXd vectorTranspose = vector.transpose();
vector(0) = 10;
std::cout << vector << "n"; // shows col vector [10, 2, 3]
std::cout << vectorTranspose << "n"; // still shows col vector [1, 2, 3]
std::cout << vector * vectorTranspose << "n"; // this gives the error of "invalid matrix product"
std::cout << vector * vector.transpose() << "n"; // this gives the correct behavior
所以我的问题是:
- 对于形状为 n x 1 的列向量,为什么转置仍然给出列向量而不是行向量? 调用 vector * vector.transpose((
- 是由于创建 vector.transpose(( 而导致浪费还是 Eigen 对此做了一些聪明的事情?
我只想回答第一部分(没有足够的声誉来简单地评论(。
问题是vectorTranspose
被声明为VectorXd
,它表示一个列向量。动态大小行向量代替类型RowVectorXd
。请尝试以下操作:
Eigen::VectorXd v(3);
v << 1,2,3;
Eigen::VectorXd wrong = v.transpose();
Eigen::RowVectorXd correct = v.transpose();
std::cout << "v: " << v.rows() << "x" << v.cols() << std::endl;
std::cout << "wrong: " << wrong.rows() << "x" << wrong.cols() << std::endl;
std::cout << "correct: " << correct.rows() << "x" << correct.cols() << std::endl;
应该打印:
v: 3x1
wrong: 3x1
correct: 1x3
Eigen 允许将向量复制到其他向量中,即使它们具有不同的布局,即colVec = rowVec
通过将行向量的元素复制到列向量中来工作,而无需更改列向量的布局。列向量的布局不能改变的原因是VectorXd
实际上与Matrix<double,Dynamic,1>
相同:它必须具有单个列。我相信这种"奇怪"的副本(行到列向量,反之亦然(意味着一种方便。
相关文章:
- 在为LINUX创建共享库时,如何避免STL的私有/弱副本
- 创建提升::shared_ptr的深层副本
- Eigen - matrix.transpose 会创建矩阵的副本吗?
- 将 MatrixXd 的行传递给要修改的函数,而不在 Eigen 中创建副本
- 创建字符串流副本
- 是否可以在并行区域中为共享 2D 数组创建选定元素的线程本地副本?(共享,私有,障碍:OPenMP)
- C++ 在其自己的类中创建对象的修改副本
- std::可选参数会创建副本吗?
- 使用 lambda 表达式创建线程时,如何为每个线程提供自己的 lambda 表达式副本
- C++ 如何创建链表的副本作为类对象
- MSVC 2017 在共享库中创建模板函数的副本
- 我如何创建一个双重指针的深层副本,涉及其他类(C )
- 是 std::make_pair 在将对象添加到地图时创建副本
- 阻止用户创建班级对象的副本,但允许动态的对象有什么好处
- 取消引用指针以创建数组的副本
- 创建std :: vector减去一个元素的副本的最快方法
- 此分配是否创建副本
- C++ Qt如何通过小的更改创建GUI的副本
- C++ STL:在创建 std::string 的 const 副本时将更改 c_str()
- 使用矢量push_back代码创建对象副本时遇到问题