1

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

我认为 intersect 将是要走的路,但我看不到引入公差的方法。同样使用带有绝对差异语句的 for 循环似乎也不起作用。

任何帮助将非常感激。

4

3 回答 3

3

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

于 2013-03-04T21:13:32.193 回答
1

为此,我有另一种 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,所以代码没有测试

于 2013-03-04T21:45:17.613 回答
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;
于 2013-03-05T20:42:10.503 回答