Matlab中的成员检查和日期范围检查

发布于 2024-10-25 20:08:33 字数 776 浏览 3 评论 0原文

我有 2 个具有相同 ID 的矩阵。我需要从 mat1 中提取 ID 行,这些 ID 的日期在 mat2 中的日期的 ±5 天内。对于 mat2 也进行相同的操作。请查看此处的数据:UNIQCols = [1 2] ;日期列 = [3] ;值列 = [4] ; dayRange = +- 15天

      % 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 或按年分开。所以范围总是 << (日期2-日期1)请帮忙,谢谢!

I have 2 matrices with the SAME IDs. I need to extract those rows of IDs from mat1 which have their dates within say ±5 days of the dates in the mat2. Same operation for mat2 as well. Please see the data here: 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 ] ;

This needs to be a vectorized operation! The IDs are ordered in increasing order of dates. Dates are either separated on Q or Annual basis. So the range will be always << (date2-date1) Please help and thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

蹲墙角沉默 2024-11-01 20:08:33

这是一个基于我在评论中提到的类似问题的函数。请记住,您的矩阵必须按日期排序。

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,:);

我还没有尝试过任何矢量化解决方案来解决您的问题。如果您遇到任何问题,请尝试针对此解决方案并检查时间和内存消耗(包括排序步骤)。

Here is a function based on similar question I mentioned in my comments. Remember your matrices has to be sorted by date.

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

And the test script:

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,:);

I haven't tried any vectorized solution for your problem. If you get any try it against this solution and check the timing and memory consumption (include sorting step).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文