MatLab ismembertol函数,该函数不允许元素与多个其他元素匹配

MatLab ismembertol函数,该函数不允许元素与多个其他元素匹配,matlab,matrix,unique,Matlab,Matrix,Unique,我有两列矩阵,行数不等 两个列矩阵(我们称它们为T1和T2)都是按递增顺序排序的非周期唯一整数集 T1和T2可通过以下方式模拟: T1=sort(randperm(10E6,100)) ; T1=T1'; T2=sort(randperm(10E6,100)) ; T2=T2'; 我想做的是计算T1矩阵中元素与T2矩阵中元素在设定公差范围内的唯一匹配。也就是说,如果T1中的元素与T2中的元素匹配,则两个元素都不能与任何其他元素匹配 我知道ismembertol给出了一个逻辑值,其中T1的元素

我有两列矩阵,行数不等

两个列矩阵(我们称它们为
T1
T2
)都是按递增顺序排序的非周期唯一整数集

T1
T2
可通过以下方式模拟:

T1=sort(randperm(10E6,100)) ;
T1=T1';

T2=sort(randperm(10E6,100)) ;
T2=T2';
我想做的是计算
T1
矩阵中元素与
T2
矩阵中元素在设定公差范围内的唯一匹配。也就是说,如果
T1
中的元素与
T2
中的元素匹配,则两个元素都不能与任何其他元素匹配

我知道
ismembertol
给出了一个逻辑值,其中
T1
的元素在
T2
的元素公差范围内,但是,MathWorks的文档没有指定找到的匹配是否唯一。从我自己的测试来看,似乎不是这样


有没有办法计算两个矩阵之间的这种唯一匹配?

您可以使用
interp1
函数查找
T1
T2
的最近匹配项,并分配相应的元素
T2
的值
所以如果
T1=[1;5;15;18]
T2=[2;3;6;50]out
out=[1 5 5 18]
这意味着
T2
的第一个元素与
T1
的第一个元素匹配,
T2
的第二和第三个元素与
T1
的第二个元素匹配,
T2
的第四个元素与
T1
的第四个元素匹配。因此,我们有两个
T2
元素,它们与
T1
中的相同元素相匹配,我们需要删除(忽略)与
T1
元素距离较大的元素。对于it元素,首先根据其距离和提取的第一个唯一元素的索引进行排序。最后,
result
是所需公差内相同元素的计数
tol

out = interp1(T1, T1,T2, 'nearest', 'extrap');
DIST = abs(out - T2);
[~,IS] = sortrows([out DIST]);
[~,IU] = unique(out(IS) ,'first');
result = sum(DIST(IS(IU)) < tol);
out=interp1(T1,T1,T2,'最近的','extrap');
DIST=abs(out-T2);
[~,IS]=sortrows([out DIST]);
[~,IU]=唯一(out(IS),'first');
结果=总和(DIST(IS(IU))
来自你的句子

也就是说,如果T1中的元素与T2中的元素匹配, 两个元素都不能与任何其他元素匹配“

您似乎在寻找双向检查,这意味着ismember ish工具似乎不适合您,因为它们有方向

首先,我必须在这里设置一个伪版本,用于检查公差范围内的相等性:

 function out=isequaltol(a,b,tol)

if numel(a)>numel(b)

    out=zeros(size(a));

else

    out=zeros(size(b));

end

out(abs(a-b)<tol)=1;

end
样本运行
假设
T1=[5;12]
T2=[6;8]且公差为5。前6个将与5个匹配,因此没有问题。现在8不应该与5匹配,但它应该与12匹配还是应该被忽略?@rahnema1在这种情况下,数组
T2
的8应该被忽略。我取消了我的答案
T1=sort(randperm(100,10)) ;
T1=T1';

T2=sort(randperm(100,10)) ;
T2=T2';

% define tolerance
tol=10;

% Create function handle to equality within tol checking
fun=@(a,b) isequaltol(a,b,tol);

% Concatenate all values in T1 and T2
All_values=sort([T1;T2]);

% Check for equality within tolerance between All_values and itself using bsxfun and its singleton expansion:
TmpOut=bsxfun(fun,All_values,All_values.');

% Discard diagonal values as they are 1 for sure
TmpOut2=TmpOut-diag(diag(TmpOut));

% Now you're looking for rows that have one and only one 1 in them
Out=All_values(sum(TmpOut2,2)==1);

% If you want to get the count of such values :
Count=numel(Out);

% If you want to retrieve the value that come from T1 (resp. T2)
Out_From_T1=Out(ismember(Out,T1));
Out_From_T2=Out(ismember(Out,T2));
T1 =

     4
     7
    31
    38
    50
    61
    63
    70
    75
   100

T2 =

     9
    11
    25
    32
    40
    53
    59
    72
    74
    96

Out =

    96
   100