Arrays 如何找到给定数组A1的索引,*任意*的值实际上等于第二个数组A2的*任意*的值?

Arrays 如何找到给定数组A1的索引,*任意*的值实际上等于第二个数组A2的*任意*的值?,arrays,matlab,Arrays,Matlab,所谓“几乎相等”,我的意思是它们之间的距离是epsilon级(或0.000001)。MATLAB中的等式通常对长浮点数不起作用 如果我只做abs(A1-A2)

所谓“几乎相等”,我的意思是它们之间的距离是epsilon级(或0.000001)。MATLAB中的等式通常对长浮点数不起作用


如果我只做abs(A1-A2)<0.000001,它就不起作用了,因为大小(A1)!=大小(A2)

您可以通过使用MATLAB的
pdist2
函数计算两个向量之间的距离来得到答案

dist=pdist2(A1,A2);
minDist=min(dist,[],2);
indices_A1=minDist<=0.000001;
desired_A1=A1(indices_A1);
dist=pdist2(A1,A2);
Minist=min(dist,[],2);

由于您关心从任何元素到任何元素的距离,因此可以从矢量化矩阵创建距离矩阵,并探测距离阈值。例如:

A = rand(10, 4); % (example) matrix A 
B = rand(3, 5);  % matrix B of different size 
minDist = 0.005; 
解决方案:按列和行重复矢量化矩阵,以获得相同大小的矩阵,并应用基于矩阵的距离估计:

Da = repmat(A(:), 1, length(B(:)));  % size 40 x 15
Db = repmat(B(:)', length(A(:)), 1); % size 40 x 15 
DD = Da - Db; 
indA = any(abs(DD) < minDist, 2); 
此外:您可以使用以下方法将行索引(对应于元素)映射回矩阵A索引:

[iA, jA] = ind2sub(size(A), indA);
断言/测试所有返回值都小于
minDist
,例如使用:

for k = 1:length(iA); 
    d(k) = min(min(abs(A(iA(k), jA(k)) - B)));
end
all(d < minDist)
k=1时的
:长度(iA);
d(k)=min(min(abs(A(iA(k),jA(k))-B));
结束
全部(d

(在倍频程3.6.2中测试)

@Shai我强烈反对。利用矢量化和矩阵计算是MATLAB的核心!没有循环,没有高级包装。另外,从算法的角度来看,这将提供2D阵列上的所有距离。(注意:循环用于断言,解决方案是2次调用repmat和一次矩阵减法)。恕我直言,我不同意你的意见。使用
bsxfun
会使
repmat
和循环冗余<代码>[ia1 ia2]=find(abs(bsxfun(@减号,A1(:),A2(:))
现在
ia1
是所有实际等效条目的
A1
的线性索引。这些可以使用
[r1c1]=ind2sub(大小(A1),ia1)转换为行/列索引对于循环:
d=min(abs(bsxfun(@减号,A1(ia1),A2(:),[],2)
all(d
@Shai点为
bsxfun
。我更新了我的答案,将其作为一种替代方案(与使用repmat相比),同时牢记效率问题(取决于矩阵大小)。请随意发布所有不同的选择作为新答案。
for k = 1:length(iA); 
    d(k) = min(min(abs(A(iA(k), jA(k)) - B)));
end
all(d < minDist)