我有两个长度不等的列向量,calib
(75个元素)和nu
(1436个元素)。我需要在nu
中找到与calib
中的元素匹配的元素,在0.001的容差范围内,然后对结果向量执行操作。所有元素都是数字而不是字符串。
我认为相交是可行的方法,但我没有看到引入容忍的方法。使用带有绝对差异语句的for循环似乎也不起作用。
非常感谢任何帮助。
答案 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;