在不等大小的非整数matlab数组中找到最接近的元素

时间:2014-04-29 15:13:50

标签: arrays matlab vectorization

我有2个矩阵t = [1,2880000]和t1 = [1,143986]。

我正在尝试找出这两个数组之间最接近的元素。我尝试了以下代码,它在较小的数组上工作正常,但在大型数组上却没有。

% create two similar sized matrix and find out difference between each element
t1_m=repmat(t1', size(t)); 
t_m=repmat(t, size(t1'));
diff_m=abs(t_m-t1_m);
ind1=find(diff_m<1e-5);

这给了repmat的内存不足问题。非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

如果我正确地理解了你的问题,你会得到两组数字,你需要找到彼此最接近的对。

这原则上是一个二次问题,但是,它可以通过排序减少到NlogN(及时)问题(假设您的数组是&#34;足够稀疏&#34;)。

  A = rand(1000,1) 
  B = rand(1100,1)

是你的两套。

我们构造了两个

的标记并列数组C
C = [A ones(size(A)) ;
     B 2*ones(size(B))]

所以目前C的第一列包含A的元素(在第二列中标有1)和B的元素(已标记)由2)。我们将C排序为关闭元素彼此关闭

D = sortrows(C).

现在,如果我们差异D,我们就会有类似

的内容
>> E = abs(diff(D))

   0.000694103278079                   0
   0.000153057031699                   0
   0.000557077905541                   0
   0.001520045249172   1.000000000000000
   0.000249084264359   1.000000000000000
   0.000148379610173                   0
   0.000013761461813   1.000000000000000

告诉我们,只要1出现,我们就会计算两个不同集合的 close 元素之间的差异。所以我们通过

找到这样的元素
  idx_good = find(E(:,1) < 1e-5 & E(:,2) == 1)

我们把它们写成

  >> [D((idx_good),1) D((idx_good)+1)]

  ans =

   0.042652410911143   0.042659855935049
   0.060466771939828   0.060471179169894
   0.075966691690842   0.075967361294136
   0.119207259421287   0.119214541054191
   0.146514856442232   0.146514910614890
   0.205672339463963   0.205674521464760
   0.208461358751314   0.208470223305320
   0.234779913372406   0.234782640662848

其中包含第一列中A的元素和第二列中B的元素。

嗯,这还不够,因为我们发现只有一些元素满足这个属性(如果你正在查看绝对最接近的一对就足够了,无论如何)。

因此,为了所有可能足够接近的近对,我们必须重复应用diff中不断增长的偏移量的技巧。换句话说,可以定义一个函数

 diff_ext = @(m,amount) m(1:end-amount,:) - m(1+amount:end,:);

代替diff,用于增加amount的整数值

abs(diff_ext(D,amount))

允许小于阈值的元素。

您找到的元素必须在紧密差异的集合中添加。

答案 1 :(得分:1)

相反,你可以简单地使用:

% handle if t,t1 have different length
sz = min(size(t, 2), size(t1, 2));
t2 = t(1:sz);
t3 = t1(1:sz);

[dist,ind] = min(abs(t2-t3)) % ind gives you the index, dist is min-difference

测试用例:

t=[0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1];
t1=[0.4 0.5 0.6 0.7];

你会得到:

dist =

    0.3000


ind =

     4

注意:如果多个索引具有最小差异,它将为您提供最后一个索引。