我有两个长度不等的列向量,calib
(75 个元素)和nu
(1436 个元素)。我需要在 0.001 的容差内找到与元素nu
匹配的元素calib
,然后对结果向量执行操作。所有元素都是数字而不是字符串。
我认为 intersect 将是要走的路,但我看不到引入公差的方法。同样使用带有绝对差异语句的 for 循环似乎也不起作用。
任何帮助将非常感激。
您可以将round
其中一个向量显示为仅 0.001 的准确度,然后使用ismember
. 或者只使用FEX 中的ismemberf - 浮点 ISMEMBER(即,具有舍入容差)。
为此,我有另一种 Matlabic (=matrix) 方式。我不知道它的计算效率如何,但 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,所以代码没有测试
谢谢您的帮助。矩阵数学把我带到了我需要去的地方。我不知道是否有更好的方法来做到这一点,但这是我的代码有效:
% 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;