C++中如何对不同大小的步长型向量执行减法操作?
搞定同大小向量减法的通用方案
嘿,我完全懂你的困扰!你有两个存曲线坐标的向量:一个是按步长5生成的,长度是5、10、15……也就是5n;另一个是步长6生成的,长度是6、12、18……也就是6n。现在想把它们调成一样长再做减法,之前n=1的时候你试过把6长度的向量去掉中间俩元素改成5长度,但换成通用场景用循环实现就卡壳了,对吧?
核心思路:均匀采样才是通用解法
因为是曲线坐标,咱们得保证调整后的向量能对应曲线的相同位置,不能随便乱删元素。最靠谱的方式是均匀采样——把长的那个向量(也就是6n长度的)按比例选5n个点,这样首尾点完全对齐,中间点也均匀分布,不会破坏曲线的特征。
通用循环实现的步骤拆解
假设我们要把6n长度的vecB缩减成5n长度的vecB_new,关键是算出每个目标点在原vecB里的位置:
- 先拿到两个向量的长度:
len_A = 5*n,len_B = 6*n - 对vecB_new里的第i个元素(从0开始数),对应的原vecB索引是
round(i * (len_B - 1) / (len_A - 1))——这个公式的意思是把vecB的长度按比例映射到vecA的长度,四舍五入保证点的分布均匀。 - 用循环挨个取对应索引的元素,存到新向量里,之后就能和vecA做逐元素减法啦。
举个Python代码例子
n = 2 # 比如n=2时,vecA长度10,vecB长度12 vecA = [5*i for i in range(1, 5*n +1)] # 步长5生成的坐标 vecB = [6*j for j in range(1, 6*n +1)] # 步长6生成的坐标 len_A = len(vecA) len_B = len(vecB) vecB_new = [] for i in range(len_A): # 计算要取的索引,四舍五入保证均匀 idx = round(i * (len_B - 1) / (len_A - 1)) vecB_new.append(vecB[idx]) # 现在可以放心做减法了 sub_result = [a - b for a, b in zip(vecA, vecB_new)] print("调整后的vecB:", vecB_new) print("减法结果:", sub_result)
再给个C++的版本
#include <vector> #include <cmath> #include <iostream> using namespace std; int main() { int n = 2; vector<int> vecA, vecB; // 生成vecA:步长5,长度5n for (int i = 1; i <= 5*n; ++i) { vecA.push_back(5*i); } // 生成vecB:步长6,长度6n for (int j = 1; j <= 6*n; ++j) { vecB.push_back(6*j); } int lenA = vecA.size(); int lenB = vecB.size(); vector<int> vecB_new; for (int i = 0; i < lenA; ++i) { // 计算对应索引,用round取整保证均匀分布 int idx = round(static_cast<double>(i) * (lenB - 1) / (lenA - 1)); vecB_new.push_back(vecB[idx]); } // 执行减法操作 vector<int> sub_result; for (int k = 0; k < lenA; ++k) { sub_result.push_back(vecA[k] - vecB_new[k]); } // 输出结果 cout << "调整后的vecB: "; for (int num : vecB_new) cout << num << " "; cout << endl; cout << "减法结果: "; for (int num : sub_result) cout << num << " "; cout << endl; return 0; }
为啥不直接固定删中间元素?
你之前n=1时删中间2个元素没问题,但n变大就不行啦——比如n=2时,vecB长度12,要缩到10,总不能还只删2个中间元素吧?均匀采样的方式不管n是多少,都能自动计算要取的点,保证曲线坐标对应,通用性强得多。
要是你有特殊需求必须删中间固定数量的元素(比如每次删n个,因为6n-5n=n),那也可以算中间n个元素的索引范围,循环的时候跳过这些索引就行,但这种方式只适合特定场景,还是均匀采样更实用。
内容的提问来源于stack exchange,提问作者Carrot Cake
相关产品推荐
相关产品推荐

