[segment(i).min_mc,segment(i).bestseg,segment(i).t_seg1mc,segment(i).t_seg2mc] = topDownSeg(data,segment(i),q)
时间: 2024-05-23 17:11:18 浏览: 6
这行代码是调用了一个名为 topDownSeg 的函数,并将函数的返回值赋值给了 segment(i).min_mc、segment(i).bestseg、segment(i).t_seg1mc 和 segment(i).t_seg2mc 四个变量。
具体来说,该函数的输入参数为 data、segment(i) 和 q,其中 data 是一个数据序列,segment(i) 是一个表示序列中某个子序列的对象,q 是一个正则化参数。函数的作用是对该子序列进行自上而下的分段,返回四个值:
- segment(i).min_mc:分段后的最小化代价;
- segment(i).bestseg:分段后的最优分段方案;
- segment(i).t_seg1mc:分段后的第一部分子序列的最小化代价;
- segment(i).t_seg2mc:分段后的第二部分子序列的最小化代价。
相关问题
def __init__(self, json_dir, n_src=2, sample_rate=8000, segment=4.0): super().__init__() # Task setting self.json_dir = json_dir self.sample_rate = sample_rate if segment is None: self.seg_len = None else: self.seg_len = int(segment * sample_rate) self.n_src = n_src self.like_test = self.seg_len is None # Load json files mix_json = os.path.join(json_dir, "mix.json") sources_json = [ os.path.join(json_dir, source + ".json") for source in [f"s{n+1}" for n in range(n_src)] ] with open(mix_json, "r") as f: mix_infos = json.load(f) sources_infos = [] for src_json in sources_json: with open(src_json, "r") as f: sources_infos.append(json.load(f)) # Filter out short utterances only when segment is specified orig_len = len(mix_infos) drop_utt, drop_len = 0, 0 if not self.like_test: for i in range(len(mix_infos) - 1, -1, -1): # Go backward if mix_infos[i][1] < self.seg_len: drop_utt += 1 drop_len += mix_infos[i][1] del mix_infos[i] for src_inf in sources_infos: del src_inf[i] print( "Drop {} utts({:.2f} h) from {} (shorter than {} samples)".format( drop_utt, drop_len / sample_rate / 36000, orig_len, self.seg_len ) ) self.mix = mix_infos self.sources = sources_infos
这是一个 Python 类的初始化函数,看起来是用于处理音频混合数据和其源数据的。具体来说,它的输入参数包括一个 JSON 目录、音频源的数量、采样率和段长度等。它会从指定的 JSON 文件中读取混合音频和其源音频的信息,并对其中长度太短的音频进行过滤。最终,该函数会将处理好的音频混合数据和其源数据存储在该类的 mix 和 sources 属性中。
将这个双while循环的写法,改成快慢指针或其他更优的方法实现 void FlightStage::UpdateAllDistance2Boundary(vector<MapPoint> &rps) { //rps means reference_points_smoothed if (rps.empty()) return; //separate lines and curves vector<pair<MapPoint, MapPoint>> lines, curves; size_t index = 0; while (index < rps.size() - 1) { pair<MapPoint, MapPoint> seg; seg.first = rps[index]; while (index < rps.size() - 1 && (Equals(seg.first.kappa, rps[index + 1].kappa) || ((isnan(seg.first.kappa) || iszero(seg.first.kappa)) && (isnan(rps[index + 1].kappa) || iszero(rps[index + 1].kappa))))) { seg.second = rps[index + 1]; index++; } if (!isnan(seg.first.s) && !isnan(seg.second.s)) { seg.second = rps[index];//lines and curves are unconnected seg.first.point_enu.z = 0.0; seg.second.point_enu.z = 0.0; (isnan(seg.first.kappa) || iszero(seg.first.kappa)) ? lines.emplace_back(seg) : curves.emplace_back(seg); } index++; }}
可以将双while循环改写为单while循环和双指针的方式来实现。首先,我们可以使用一个指针fast和一个指针slow,初始时都指向rps的第一个元素。然后,我们可以使用一个变量prevKappa来存储上一个元素的kappa值。
以下是改写后的代码示例:
```cpp
void FlightStage::UpdateAllDistance2Boundary(vector<MapPoint> &rps) {
if (rps.empty()) return;
vector<pair<MapPoint, MapPoint>> lines, curves;
size_t slow = 0;
size_t fast = 0;
double prevKappa = rps[0].kappa;
while (fast < rps.size()) {
if (Equals(rps[fast].kappa, prevKappa) ||
((isnan(prevKappa) || iszero(prevKappa)) &&
(isnan(rps[fast].kappa) || iszero(rps[fast].kappa)))) {
fast++;
} else {
pair<MapPoint, MapPoint> seg;
seg.first = rps[slow];
seg.second = rps[fast - 1];
if (!isnan(seg.first.s) && !isnan(seg.second.s)) {
seg.first.point_enu.z = 0.0;
seg.second.point_enu.z = 0.0;
(isnan(seg.first.kappa) || iszero(seg.first.kappa)) ?
lines.emplace_back(seg) : curves.emplace_back(seg);
}
slow = fast;
prevKappa = rps[fast].kappa;
}
}
// Handle the last segment
if (slow < rps.size()) {
pair<MapPoint, MapPoint> seg;
seg.first = rps[slow];
seg.second = rps[rps.size() - 1];
if (!isnan(seg.first.s) && !isnan(seg.second.s)) {
seg.first.point_enu.z = 0.0;
seg.second.point_enu.z = 0.0;
(isnan(seg.first.kappa) || iszero(seg.first.kappa)) ?
lines.emplace_back(seg) : curves.emplace_back(seg);
}
}
}
```
这样,我们通过使用双指针来遍历rps,只需要一次遍历就可以得到lines和curves,避免了双while循环的使用。