【发布时间】:2020-01-07 05:08:47
【问题描述】:
我正在为传感器进行数字采样。我有以下代码来计算最高振幅和相应的时间。
struct LidarPoints{
float timeStamp;
float Power;
}
std::vector<LidarPoints> measurement; // To store Lidar points of current measurement
目前功率和能量是相同的(因为delta函数)并且向量是按时间升序排列的。我想将其更改为步进功能。脉冲持续时间是恒定的 10ns。
uint32_t pulseDuration = 5;
问题是找到样本之间的任何重叠,如果有的话,将幅度相加。
我目前使用以下代码:
for(auto i= 0; i< measurement.size(); i++){
for(auto j=i+1; i< measurement.size(); j++){
if(measurement[j].timeStamp - measurement[i].timeStamp) < pulseDuration){
measurement[i].Power += measurement[j].Power;
measurement[i].timeStamp = (measurement[i].timeStamp + measurement[j].timeStamp)/2.0f;
}
}
}
是否可以在没有两个 for 循环的情况下编写此代码,因为我无法承受嵌套循环所花费的时间。
【问题讨论】:
-
这里的问题不是嵌套循环,而是一旦时间戳超出范围就不会中断。每次迭代一直到
measurement.size()只是浪费资源。 -
您问错了问题:“两个嵌套循环或 1 个单循环或 3 个嵌套循环”无关紧要。这似乎违反直觉,但真正重要的是复杂性。您可能会将 2 个嵌套循环与
O(n^2)复杂性相关联,但情况并非总是如此。此外,您可以在单个循环中轻松拥有O(n^2)或最差复杂性(或多或少隐藏)。 -
我真的很抱歉命名约定。 “timeStamp”在项目中不再是timeStamp,而是激光雷达脉冲传输和接收之间的deltaTime。它总是在限制之下。我需要为 56000 个点减少两个 for 循环造成的开销。
-
@bolov 谢谢。我只需要知道如何减少代码花费的时间,并且我对内存没有任何担忧。
-
是的,这里的两个嵌套循环是一种逻辑上有缺陷的方法。这应该作为一个简单的循环来完成。不幸的是,关于如何组合样本的完整规范(关于时间戳)尚不清楚,因此无法提出进一步的建议。
标签: c++ nested-loops lidar