Matlab中如何比较不同大小多向量元素,保留符合条件值并取平均?
解决Matlab中三向量两两匹配并保留接近值平均值的问题
我来给你一步步捋清楚怎么实现这个需求哈!咱们就拿你给出的示例向量和幅值容差(1.5)来做演示,核心目标是:找出仅在两个向量里存在幅值差≤容差的元素对,然后取它们的平均值作为最终结果。
第一步:定义基础数据
先把示例中的向量和容差定义好:
a = [10+8i, 20]; b = [10+9i, 30, 40+3i, 55]; c = [10, 60, 41+3i]; tolerance = 1.5; % 幅值容差
第二步:写一个辅助函数找两两向量的匹配对
先封装一个小函数,用来快速找出两个向量中满足幅值差条件的元素对,并计算它们的平均值:
function [matches, avg_vals] = find_close_pairs(vec1, vec2, tol) % 计算两个向量所有元素间的幅值差矩阵 mag_diff = abs(vec1 - vec2'); % 找出满足容差的元素索引对 [idx1, idx2] = find(mag_diff <= tol); % 去重:确保每个元素只匹配一次(避免重复计算) [unique_idx1, ~] = unique(idx1); unique_idx2 = idx2(ismember(idx1, unique_idx1)); % 计算匹配对的平均值 avg_vals = (vec1(unique_idx1) + vec2(unique_idx2)) / 2; matches = [unique_idx1, unique_idx2]; end
第三步:计算所有两两组合的匹配
用上面的函数分别处理a&b、a&c、b&c这三组组合:
% 获取a与b的匹配对及平均值 [ab_matches, ab_avg] = find_close_pairs(a, b, tolerance); % 获取a与c的匹配对及平均值 [ac_matches, ac_avg] = find_close_pairs(a, c, tolerance); % 获取b与c的匹配对及平均值 [bc_matches, bc_avg] = find_close_pairs(b, c, tolerance);
第四步:过滤掉“在第三个向量也有匹配”的元素对
这是核心的一步!我们需要排除那些在第三个向量里也有接近匹配的元素对,只保留仅在两个向量中满足条件的结果:
% 过滤a&b的匹配:检查元素是否在c中也有接近值 filtered_ab = []; for i = 1:length(ab_avg) a_elem = a(ab_matches(i,1)); b_elem = b(ab_matches(i,2)); % 判断两个元素是否在c中存在接近值 a_in_c = any(abs(a_elem - c) <= tolerance); b_in_c = any(abs(b_elem - c) <= tolerance); % 只有两个元素都不在c中有匹配,才保留 if ~a_in_c && ~b_in_c filtered_ab = [filtered_ab, ab_avg(i)]; end end % 过滤a&c的匹配:检查元素是否在b中也有接近值 filtered_ac = []; for i = 1:length(ac_avg) a_elem = a(ac_matches(i,1)); c_elem = c(ac_matches(i,2)); a_in_b = any(abs(a_elem - b) <= tolerance); c_in_b = any(abs(c_elem - b) <= tolerance); if ~a_in_b && ~c_in_b filtered_ac = [filtered_ac, ac_avg(i)]; end end % 过滤b&c的匹配:检查元素是否在a中也有接近值 filtered_bc = []; for i = 1:length(bc_avg) b_elem = b(bc_matches(i,1)); c_elem = c(bc_matches(i,2)); b_in_a = any(abs(b_elem - a) <= tolerance); c_in_a = any(abs(c_elem - a) <= tolerance); if ~b_in_a && ~c_in_a filtered_bc = [filtered_bc, bc_avg(i)]; end end % 合并所有符合条件的最终结果 final_result = [filtered_ab, filtered_ac, filtered_bc];
示例运行结果
按照你的示例数据,运行后最终结果是:
final_result = 10.0000 + 8.5000i 40.5000 + 3.0000i
对应的逻辑是:
a中的10+8i和b中的10+9i幅值差为1,满足容差,且这两个元素在c中都没有接近值,所以保留平均值10+8.5i;b中的40+3i和c中的41+3i幅值差为1,满足容差,且这两个元素在a中都没有接近值,所以保留平均值40.5+3i;a和c之间没有满足条件的匹配对。
如果你的向量数据有变化,只需要替换初始的a、b、c和tolerance值即可复用这套代码~
内容的提问来源于stack exchange,提问作者ManUtdBloke
相关产品推荐
相关产品推荐

