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

在matlab中,在公差范围内,在长度不等的向量中查找相似元素,matlab,vector,compare,Matlab,Vector,Compare,我有两个长度不等的列向量,calib(75个元素)和nu(1436个元素)。我需要在nu中找到与calib中的元素匹配到0.001公差范围内的元素,然后对结果向量执行操作。所有元素都是数字而不是字符串 我原以为intersect是一条路,但我看不到引入公差的方法。另外,使用带有绝对差分语句的for循环似乎也不起作用 任何帮助都将不胜感激。您可以对其中一个向量进行取整,以仅显示0.001精度,然后使用ismember。 或者只需使用FEX中的-Floating point ISMEMBER(即,具

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

我原以为intersect是一条路,但我看不到引入公差的方法。另外,使用带有绝对差分语句的for循环似乎也不起作用


任何帮助都将不胜感激。

您可以
对其中一个向量进行取整,以仅显示0.001精度,然后使用
ismember

或者只需使用FEX中的-Floating point ISMEMBER(即,具有舍入公差)。

您可以
舍入其中一个向量以仅显示0.001精度,然后使用
ISMEMBER
。 或者只使用FEX中的-Floating point ISMEMBER(即,具有舍入公差)。

我有另一种Matlabic(=矩阵)方法。我不知道这在计算效率上有多高,但Matlab应该擅长矩阵

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

然后,您可以制作另一个矩阵
1436x75
,即上述矩阵的绝对差值:

diff_m = abs(calib_m - nu_m)
现在在每列中找到最小的元素:

min_m = min(diff_m)
然后,您可以引入阈值并进行逻辑索引(应该很快):

ok\u calib\u元素=校准(最小值<阈值)
PS:我这里没有Matlab,所以代码没有经过测试

我有另一种Matlabic(=矩阵)方法。我不知道这在计算效率上有多高,但Matlab应该擅长矩阵

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

然后,您可以制作另一个矩阵
1436x75
,即上述矩阵的绝对差值:

diff_m = abs(calib_m - nu_m)
现在在每列中找到最小的元素:

min_m = min(diff_m)
然后,您可以引入阈值并进行逻辑索引(应该很快):

ok\u calib\u元素=校准(最小值<阈值)

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;
%设置在数据中查找相等值的公差
发现_tol=1E-3;
%制作数据矩阵和校准向量
nu_m=repmat(nu',尺寸(校准));
calib_m=repmat(calib,size(nu'));
%减去矩阵
diff_m=校准-nu_m;
%找出公差范围内每列的最小值并计算
%平均位移
find\u min\u nu=find(diff\u m-find\u tol);
最小值=差异(查找最小值);
偏移量=平均值(最小值);
%输出校准值
校准\u nu=nu+shift\u nu;

谢谢你的帮助。矩阵数学让我找到了我需要去的地方。我不知道是否有更好的方法,但以下是我的代码:

% 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;
%设置在数据中查找相等值的公差
发现_tol=1E-3;
%制作数据矩阵和校准向量
nu_m=repmat(nu',尺寸(校准));
calib_m=repmat(calib,size(nu'));
%减去矩阵
diff_m=校准-nu_m;
%找出公差范围内每列的最小值并计算
%平均位移
find\u min\u nu=find(diff\u m-find\u tol);
最小值=差异(查找最小值);
偏移量=平均值(最小值);
%输出校准值
校准\u nu=nu+shift\u nu;

检查我前面的问题,这可能会有所帮助:这是一个有趣的想法。我得试一下,再好好玩玩。看看我前面的问题,这可能会有帮助:这是一个有趣的想法。我得试一下,再玩玩一下。谢谢。最后我用了一个变体。很高兴能帮上忙。很高兴这是个好办法。将工作从Matlab切换到Python,有时我会错过Matlab优雅的无循环编码。谢谢。最后我用了一个变体。很高兴能帮上忙。很高兴这是个好办法。将工作从Matlab切换到Python,我有时会错过Matlab优雅的无循环编码。