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

时间:2018-03-20 11:19:22

标签: 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

然后例程应返回一个长度向量,其中包含每组数字的平均值:

finalVec = [10+8.5i,40.5+3i];

在Matlab中执行此操作的最有效方法是什么?有没有比直接循环所有元素更好的方法?

2 个答案:

答案 0 :(得分:4)

this solution

为基础
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

答案 1 :(得分:2)

% 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

请注意,cellfun()并不比连续多次调用函数或使用for循环快。但是增加比前者更多的载体会更容易,并且IMO比后者更好看。