- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我最近一篇文章中的一位评论者告诉我,我需要更好地利用 C++11 move 语义来处理代码中的瓶颈。以下是需要修复的简化版本。
#include <iostream>
#include <Eigen/Dense>
#include <vector>
void makeCopy(std::vector<Eigen::VectorXd> &oldV){
int n = oldV.size();
std::vector<Eigen::VectorXd> mandatoryCopy;
mandatoryCopy.resize(n);
for(int i = 0; i < n; i++){
mandatoryCopy[i] = oldV[i];
}
// swap the two
oldV = mandatoryCopy;
}
int main(int argc, char **argv)
{
// starting vector
int len(1000);
Eigen::VectorXd placeHolder(50);
std::vector<Eigen::VectorXd> v(len, placeHolder);
// copy it a bunch of times
for(int iter = 0; iter < 1000; ++iter){
std::cout << "iter: " << iter << "\n";
makeCopy(v);
}
return 0;
}
问题:在makeCopy
的for循环中,oldV[i]
是一个左值,所以我怎么能做类似mandatoryCopy[i]&& =旧V[i]
?这是主要的瓶颈,对吧?我在想类似 mandatoryCopy[i]&& = std::move(oldV[i])
的东西,但这显然无法编译。
按照@vsoftco的建议,我试过了
std::vector<Eigen::VectorXd> makeCopy2(std::vector<Eigen::VectorXd> oldV){
int n = oldV.size();
std::vector<Eigen::VectorXd> mandatoryCopy;
mandatoryCopy.resize(n);
for(int i = 0; i < n; i++){
mandatoryCopy[i] = oldV[i];
}
return mandatoryCopy;
}
但我发现它比较慢。 @vsoftco 和@ggael 都提到返回修改后的复制参数会更快,而不是再次复制,我同意,但我怀疑这对我的实际代码是否可行。我可以稍后再问这个问题,但这将是一个单独的问题/线程。
最佳答案
你没有看对线。如果一份拷贝是强制性的,那么你就无法摆脱它。尽管如此,最好避免 for 循环和 right:
std::vector<Eigen::VectorXd> mandatoryCopy = oldV;
另一方面,您可以通过替换 oldV=mandatoryCopy
来省略第二个拷贝与:
std::swap(oldV,mandatoryCopy);
这将执行廉价的指针交换。你得到:
void makeCopy(std::vector<Eigen::VectorXd> &oldV){
std::vector<Eigen::VectorXd> V = oldV;
// do something with V
std::swap(oldV,V);
}
对于函数式风格,在你的第二个例子中,你必须直接使用已经是拷贝的参数:
std::vector<Eigen::VectorXd> makeCopy2(std::vector<Eigen::VectorXd> V){
// do something with V
return V;
}
并用 v = makeCopy2(v);
调用它.
不要忘记使用 -std=c++11
进行编译获取 move 语义拷贝。
最后,打包您的 vector<VectorXd>
可能会更好在 MatrixXd
内.这将显着减少内存分配的数量:
void makeCopy3(MatrixXd &oldV){
int n = oldV.cols();
MatrixXd V = oldV;
for(int i = 0; i < n; i++){
V.col(i) *= 0.99;
}
oldV.swap(V); // or oldV = std::move(V); with c++11 enabled
}
关于c++ - 如何 "move"Eigen::VectorXd s,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42442748/
如果你去this Eigen page ,你会看到你可以初始化 VectorXd带有 #include #include int main(int argc, char **argv) {
我有兴趣初始化 Eigen::VectorXd使用另一个值的 vector Eigen::VectorXd vector ,基于 vector将指出将使用哪些元素的索引。 也就是说, // This
如何在 std::vector 中复制 vector (Eigen::vectorXd)到另一个 std::vector 中的另一个 vector (Eigen::vectorXd) std::vec
我想从一个函数返回一个 Eigen::Vector 并想知道什么是正确的方法。有点像 Eigen::VectorXd& getMesh(int N) { Eigen::VectorXd mes
我是 Eigen 的初学者。我已搜索但未找到此问题的答案。 我有一个双指针数组,即 double** x 我无法控制。它以这种格式出现,我对此无能为力。我想构造一个 Eigen::VectorXd v
我有一个双指针,在其中存储一些数据。 我想直接在指针上创建一个 VectorXd 而无需复制。也就是说,VectorXd 中存储的数据只是指针中存储的数据。它们是共享的。 我知道创建一个 Vector
我有一个 Measurement有两个 Eigen::VectorXd 的对象成员 -- 一个用于 position和另一个velocity . 测量值通过扫描排列在数据集中——即,在每个时间步,一个
Eigen::VectorXd有一个 Scalar operator()(Index i)它返回索引处的系数 i在 vector 中。然而,由于 Eigen::VectorXd是一种特殊类型的 Eig
也许有人知道,Eigen中是否可以转发声明类型MatrixXd & VectorXd? 编译时出现如下错误: /usr/include/eigen3/Eigen/src/Core/Matrix.h:3
我有一个很大的m×n内存块,可以将其视为长度为n #include int main() { const int m = 100; const int n = 70; std::vect
我正在尝试将 std::set 与 Eigen 库中的 VectorXd 一起使用: typedef VectorXd Vec; bool(*fn_pt)(Vec,Vec) = vecCompare;
我正在尝试通过减少 OpenMP 来并行执行以下循环; #define EIGEN_DONT_PARALLELIZE #include #include #include #include #
我想在Eigen中定义一个VectorXd数组,下面是我的代码 void function(VectorXd * b, ...) { [snippet] vectorrows())>
我最近一篇文章中的一位评论者告诉我,我需要更好地利用 C++11 move 语义来处理代码中的瓶颈。以下是需要修复的简化版本。 #include #include #include void m
我正在寻找一种直接、快速的方法来转换 list至 MatrixXd .我该怎么做? Map listV(list) 不编译。 我也在考虑迭代 list并填写MatrixXd必然,但这可能会很慢且不必要
我有一个函数,它所做的就是 Eigen::VectorXd x(%s); x 4000 个参数)上运行它时,一切都很好。但是当我在更大的上做时,我无法编译,我得到了 clang: error: un
以前有人问过类似的问题,在这里: Converting between NumericVector/Matrix and VectorXd/MatrixXd in Rcpp(Eigen) to per
假设我有一个 6 维 Eigen::VectorXd Eigen::VectorXd flat; flat.resize(6); flat M(flat.data(), 3, 2); Eigen::
我有两个 Eigen::VectorXd 对象,A 和 B,具有相同的维度 n。 我想创建一个新的 vector C,这样: 如果 B[i] 是 NaN,则 C[i] = A[i] 否则:C[i] =
我实现了一个比较运算符 operatorbool{return v1 对我不起作用,例如,下面的代码工作正常: #include "Eigen/Dense" #include #include u
我是一名优秀的程序员,十分优秀!