【发布时间】:2021-05-06 22:04:53
【问题描述】:
我正在努力实现一个用 MATLAB 编写成 C++ 的代码。
在 MATLAB 中,您可以将一个数组与另一个数组(例如 A(B))进行切片,从而在 B 中元素的值指定的索引处生成一个 A 元素的新数组。
我想在 C++ 中使用向量做类似的事情。这些向量的大小为 10000-40000 个 double 类型的元素。
我希望能够使用另一个包含要切片的索引的 int 类型向量来切片这些向量。
例如,我有一个向量 v = 和一个向量 w = 。我想使用 w 对 v 进行切片,使得切片的结果是一个新向量(因为旧向量必须保持不变) x = .
我想出了一个函数来做到这一点:
template<typename T>
std::vector<T> slice(std::vector<T>& v, std::vector<int>& id) {
std::vector<T> tmp;
tmp.reserve(id.size());
for (auto& i : id) {
tmp.emplace_back(v[i]);
}
return tmp;
}
我想知道是否有更有效的方法来完成这样的任务。速度是这里的关键,因为这个切片函数将处于一个具有大约 300000 次迭代的 for 循环中。我听说 boost 库可能包含一些有效的解决方案,但我还没有使用它的经验。
我使用 chrono 库来测量调用此切片函数所需的时间,其中要切片的向量长度为 37520,包含索引的向量大小为 1550。对于此函数的单次调用,经过的时间= 0.0004284 秒。然而,超过约 300000 次 for 循环迭代,总运行时间为 134 秒。
任何建议都会非常感激!
【问题讨论】:
-
返回 tmp 向量是 seg 错误吗?我原以为您必须通过 ref 传递或使用动态存储(可能也包含在智能 ptr 中)。
-
for (auto i : id)应该比for (auto& i : id)运行得更快,因为它在最内层循环的每次迭代中减少了一次解引用。此外,将您的函数参数声明为 const ref 可能有助于编译器优化您的代码。 -
@jackw11111 不,按值返回临时或局部变量是可以的。不是通过引用返回一个。
-
@PaulSanders 是因为 tmp 向量中的值比函数长吗? IE。 id 正在由 ref 传递?
-
@jackw11111 我不太清楚你所说的段错误是什么意思