gpt4 book ai didi

c++ - 在 C++ 中复制一维二维 vector 的最快方法

转载 作者:行者123 更新时间:2023-11-30 04:04:25 24 4
gpt4 key购买 nike

我有一个用于复数的二维 vector 。举个例子:

vector<vector<double>> Complex;
vector<double> ComplexNumber;
ComplexNumber.push_back(5); // real part
ComplexNumber.push_back(-4); // imag part
Complex.push_back(ComplexNumber); // Complex[i][0] - real part, [i][1] - imag

在我的代码深处,我需要将复杂 vector 的某些部分提取到其他部分。比如,从某个变量(一维 vector )中的索引 10 复制到 18 实部,并在其他变量(一维 vector )中从索引 10 复制到 18 实部。目前我用 for cycle 做这个:

for (int j=0; j<=Samples; j++)
{
refRealSignal[j] = ReferenseComplexSignalsSampled[(i*SignalSampleIndex)+j][0] ;
refImagSignal[j] = ReferenseComplexSignalsSampled[(i*SignalSampleIndex)+j][1] ;
}

如探查器所示,这段代码是整个程序的瓶颈。有什么办法可以改善吗?

小更新:“示例”变量是从 8 到 20 的 int,通常是 8。变量 i 来自外部 for 循环.

重大更新:因此,我推出了 2D vector 并用 complex 类重写了所有内容。此外,我在“for”循环中重写了我的 mul 操作。我不知道为什么,但是从 complex.imag 复制比从 complex.real 复制需要更多时间(多 2)。在所有这些代码性能从一个样本的 ~5 ms 增加到一个样本的 ~1.8 ms 之后。 (在我重写 mul 操作并重写整个循环后 2.5 毫秒,这是一个非常有用的建议,非常感谢)

最佳答案

如果 Samples 很大,您可以节省一些关于 i 的乘法。所以改变这个:

for (int j=0; j<=Samples; j++)
{
refRealSignal[j] = ReferenseComplexSignalsSampled[(i*SignalSampleIndex)+j][0] ;
refImagSignal[j] = ReferenseComplexSignalsSampled[(i*SignalSampleIndex)+j][1] ;
}

为此:

int index;
for(i = ..) { // assuming your code has a for loop for i
index = i*SignalSampleIndex;
for (int j=0; j<=Samples; ++j) // change the ++ as pre-fix
{
refRealSignal[j] = ReferenseComplexSignalsSampled[index+j][0] ;
refImagSignal[j] = ReferenseComplexSignalsSampled[index+j][1] ;
}
}

如 luk32 所注意到的那样,您可以执行 1 次乘法,而不是 2 * Samples

另一种方法,正如评论中所讨论的,您可以使用一个类来表示您的复数。 STL 为此提供了一个类:std::complex .

然后您将拥有一个类型为 std::complexvector,这将使您的数据更加稳健,这可能会改善局部性缓存应该利用。

你可以这样做:

#include <iostream>     // std::cout
#include <complex> // std::complex, std::real
#include <vector> // std::vector

int main ()
{
std::vector<std::complex<double> >complex;

// if you know the amount of your numbers,
// use a reserve(). Assuming you will insert
// 100000 numbers, the code would be
complex.reserve(100000);

for(int i = 0; i < 100000; ++i)
complex[i] = {0.1, 0.2};

std::cout << "Real part of 1st element: " << std::real(complex[0]) << '\n';

return 0;
}

[编辑]

乘法问题可以由编译器通过使用优化标志来执行。确保在使用优化标志编译代码时分析代码。

提示:

通常,如果某个部分正在减慢您的程序,有两种方法:(1) 使该部分更快,或 (2) 找到一种方法来减少该部分的执行频率。

(归功于 Psyduck,又名 Mooling duck)

在你的情况下,你可以尝试我上面建议的方法来使你的代码更快,但如果你重新考虑你的逻辑并避免/减少你复制的时间,那么将获得性能提升的奖励。

关于c++ - 在 C++ 中复制一维二维 vector 的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23741887/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com