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