我有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的内存不足问题。非常感谢任何帮助。
答案 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
注意:如果多个索引具有最小差异,它将为您提供最后一个索引。