我在Matlab中有三个可能具有不同大小的向量。我想比较每个向量中的值与其他向量中的所有其他值,并且只保留3个向量中的2个中“接近”的值。而'保持',我的意思是取近似值的平均值。
例如:
a = [10+8i, 20];
b = [10+9i, 30, 40+3i, 55];
c = [10, 60, 41+3i];
如果我设置了一个接近度容差,使得只保留在彼此1.5的范围内的值,则应将以下值标记为接近:
然后例程应返回一个长度向量,其中包含每组数字的平均值:
finalVec = [10+8.5i,40.5+3i];
在Matlab中执行此操作的最有效方法是什么?有没有比直接循环所有元素更好的方法?
答案 0 :(得分:4)
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比后者更好看。