Matlab 如何将多个向量(大小不同)中的元素相互比较?

Matlab 如何将多个向量(大小不同)中的元素相互比较?,matlab,Matlab,我在Matlab中有三个向量,可能大小不同。我想将每个向量中的值与其他向量中的所有其他值进行比较,并且只在3个向量中的2个保持“接近”的值。“保持”是指取接近值的平均值 例如: a = [10+8i, 20]; b = [10+9i, 30, 40+3i, 55]; c = [10, 60, 41+3i]; 如果我设置了一个接近度公差,以便只保留彼此之间在(比如)1.5量级内的值,则应将以下值标记为接近: 10+8i和10+9i 40+3i和41+3i 然后,例程应返回一个长度向量,该向量

我在Matlab中有三个向量,可能大小不同。我想将每个向量中的值与其他向量中的所有其他值进行比较,并且只在3个向量中的2个保持“接近”的值。“保持”是指取接近值的平均值

例如:

a = [10+8i, 20];
b = [10+9i, 30, 40+3i, 55];
c = [10, 60, 41+3i];
如果我设置了一个接近度公差,以便只保留彼此之间在(比如)1.5量级内的值,则应将以下值标记为接近:

  • 10+8i和10+9i
  • 40+3i和41+3i
然后,例程应返回一个长度向量,该向量包含以下每组数字的平均值:

finalVec = [10+8.5i,40.5+3i];
在Matlab中实现这一点最有效的方法是什么?有没有比在所有元素上直接循环更好的方法?

基于:

a=[10+8i,20];
b=[10+9i,30,40+3i,55];
c=[10,60,41+3i];
M1=比较_向量(a,b);
M2=比较_向量(a,c);
M3=比较_向量(b,c);
finalVec=[M1,M2,M3]
函数M=比较向量(a,b)
%矢量元素的所有组合
[A,B]=网格网格(A,B);
C=类别(2,A',B');
D=重塑(C,[],2);
%找出低于容忍度的差异
公差=1.5
低于公差=abs(D(:,1)-D(:,2))<公差;
%如果没有,则返回空
如果全部(低于公差==0)
M=[];
返回
结束
%计算返回值的平均值
M=平均值(D(低于公差,:);
结束
%您的数据
a=[10+8i,20];
b=[10+9i,30,40+3i,55];
c=[10,60,41+3i];
tol=1.5;
%使用每个向量组合调用函数并连接结果
finalVec=cell2mat(cellfun(@closepoints,{a,a,b},{b,c,c},{tol,tol,tol},'Uni',0))
函数p=闭合点(a、b、tol)
%找到闭合点的索引对
%bsxfun()部分计算两个向量的所有元素组合之间的距离
[ii,jj]=find(abs(bsxfun(@减号,a,b.))

请注意,这并不比在一行中多次调用函数或使用for循环快。但是,与前者相比,添加更多的向量会更容易,并且比后者更易于查看。

我建议您首先使用循环,然后考虑向量化,因为这显然不是一个简单的向量化选项。“早期优化是万恶之源”你的解决方案和我的解决方案有一个类似的问题:finalVec有一个空单元格,当没有比较低于容差时。这就是为什么我添加了返回空数组的选项。这真的是个问题吗?IIRC您可以将空向量与其他向量连接在一起。例如,
[[1 2][]4]
是否会导致
[1 2 4]
?对我来说,这根本不是问题,但它与op的
最终版本不一致。只是一个小细节!我忘了,uni=0的cellfun返回一个单元格,而不是一系列向量。我想现在明白了,谢谢!
a = [10+8i, 20];
b = [10+9i, 30, 40+3i, 55];
c = [10, 60, 41+3i];

M1 = compare_vectors(a , b);
M2 = compare_vectors(a , c);
M3 = compare_vectors(b , c);
finalVec = [M1, M2 , M3]


function M = compare_vectors(a , b)

    % All combinations of vectors elements
    [A,B] = meshgrid(a,b);
    C = cat(2,A',B');
    D = reshape(C,[],2);

    % Find differences lower than tolerance
    tolerance = 1.5
    below_tolerance = abs(D(:,1) - D(:,2)) < tolerance ;

    % If none, return empty
    if all(below_tolerance== 0)
        M = [];
        return
    end

    % Calculate average of returned values
    M = mean(D(below_tolerance,:));

end
% your data   
a = [10+8i, 20];
b = [10+9i, 30, 40+3i, 55];
c = [10, 60, 41+3i];
tol = 1.5;

% call the function with each combination of vectors and concatenate the results
finalVec = cell2mat(cellfun(@closepoints, {a, a, b}, {b, c, c}, {tol, tol, tol}, 'Uni', 0))

function p = closepoints(a, b, tol)
    % find the pairs of indexes of close points 
    %    the bsxfun() part calculates the distance between all combinations of elements of the two vectors
    [ii,jj] = find(abs(bsxfun(@minus, a, b.')) < tol);
    % calculate the mean
    p = (a(jj) + b(ii))/2;
end