在matlab中,在公差范围内的不等长度的向量中找到相似的元素

时间:2013-03-04 21:10:43

标签: matlab vector compare

我有两个长度不等的列向量,calib(75个元素)和nu(1436个元素)。我需要在nu中找到与calib中的元素匹配的元素,在0.001的容差范围内,然后对结果向量执行操作。所有元素都是数字而不是字符串。

我认为相交是可行的方法,但我没有看到引入容忍的方法。使用带有绝对差异语句的for循环似乎也不起作用。

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:2)

您可以round其中一个向量仅显示0.001准确度,然后使用ismember。 或者只使用ismemberf - 来自FEX的浮点ISMEMBER(即具有舍入容差)。

答案 1 :(得分:0)

我有另一种Matlabic(=矩阵)方式。我不知道这是多么有效,但Matlab应该适用于矩阵。

我假设size(nu) = [75,1]size(calib) = [1436,1]。第一步是制作两个大的1436x75矩阵(注意转置):

calib_m = repmat(calib',size(nu))
nu_m = repmat(nu,size(calib'))

然后你可以制作另一个矩阵1436x75,这是上述的绝对差异:

diff_m = abs(calib_m - nu_m)

现在找到每列中的最小元素:

min_m = min(diff_m)

然后你可以引入你的阈值并进行逻辑索引(应该很快):

ok_calib_elements = calib(min_m < THRESHOLD)

PS:我这里没有Matlab,所以代码没有经过测试

答案 2 :(得分:0)

感谢您的帮助。矩阵数学让我得到了我需要去的地方。我不知道是否有更好的方法可以做到这一点,但这是我的代码有效:

% set tolerance for finding equal values in the data
find_tol = 1E-3; 

% make matrices of the data and clibration vectors
nu_m = repmat(nu',size(calib));
calib_m = repmat(calib,size(nu'));

% subtract the matrices
diff_m = calib_m - nu_m;

% find the minimum of each column within the tolerance and compute the
% average shift
find_min_nu = find(diff_m < find_tol & diff_m > -find_tol);
min_nu = diff_m(find_min_nu);
shift_nu = mean(min_nu);

% output calibrated values
calib_nu = nu + shift_nu;