我有两个带有相同ID的矩阵。我需要从mat1
中提取那些日期在mat2
中的日期±5天内的ID行。 mat2
的操作也相同。请在此处查看数据:UNIQCols = [1 2] ; dateCol = [3] ; valueCol = [4] ; dayRange = +- 15days
。
% UniqCol Date Value
mat1 = [2001 2 733427 1001 ;
2001 2 733793 2002 ;
2001 2 734582 2003 ;
3001 1 734220 30 ;
3001 1 734588 20 ;];
mat2 = [2001 2 733790 7777 ;
2001 2 734221 2222 ;
3001 1 734220 10 ;
3001 1 734588 40 ;] ;
ans1 = [2001 2 733793 2002 ; 3001 1 734220 30 ; 3001 1 734588 20 ] ;
ans2 = [2001 2 733790 7777 ; 3001 1 734220 10 ; 3001 1 734588 40 ] ;
这需要是一个矢量化操作! ID按日期递增顺序排序。日期按Q或年度分开。所以范围总是<< (date2-date1)请帮助和谢谢!
答案 0 :(得分:0)
这是我在评论中提到的基于similar question的函数。请记住,您的矩阵必须按日期排序。
function match_for_xn = match_by_distance(xn, xm, maxdist)
%#Generates index for elements in vector xn that close to any of elements in
%#vector xm at least by distance maxdist
match_for_xn = false(length(xn), 1);
last_M = 1;
for N = 1:length(xn)
%# search through M until we find a match.
for M = last_M:length(xm)
dist_to_curr = xm(M) - xn(N);
if abs(dist_to_curr) < maxdist
match_for_xn(N) = 1;
last_M = M;
break
elseif dist_to_curr > 0
last_M = M;
break
else
continue
end
end %# M
end %# N
测试脚本:
mat1 = sortrows([
2001 2 733427 1001 ;
2001 2 733793 2002 ;
2001 2 734582 2003 ;
3001 1 734220 30 ;
3001 1 734588 20 ;
],3);
mat2 = sortrows([
2001 2 733790 7777 ;
2001 2 734221 2222 ;
3001 1 734220 10 ;
3001 1 734588 40 ;
],3);
mat1_index = match_by_distance(mat1(:,3),mat2(:,3),5);
ans1 = mat1(mat1_index,:);
mat2_index = match_by_distance(mat2(:,3),mat1(:,3),5);
ans2 = mat2(mat2_index,:);
我没有为您的问题尝试任何矢量化解决方案。如果您对此解决方案有任何尝试,请检查时间和内存消耗(包括排序步骤)。