【问题标题】:matlab: simple matrix filtering - group sizematlab:简单的矩阵过滤 - 组大小
【发布时间】:2012-06-06 08:26:45
【问题描述】:

我有一个 huuuge 矩阵,用于存储有关多个粒子轨迹的 X 和 Y 坐标的信息,简化版如下所示:

col 1- 轨道号; col 2-帧数; col 2-坐标X; col 3-坐标Y

例如:

A = 
1   1   5.14832 3.36128
1   2   5.02768 3.60944
1   3   4.85856 3.81616
1   4   5.17424 4.08384
2   1   2.02928 18.47536
2   2   2.064   18.5464
3   1   8.19648 5.31056
3   2   8.04848 5.33568
3   3   7.82016 5.29088
3   4   7.80464 5.31632
3   5   7.68256 5.4624
3   6   7.62592 5.572

现在我想过滤掉比 4 短的轨迹,并保留剩余的东西,例如(注意重新编号轨迹):

B = 

1   1   5.14832 3.36128
1   2   5.02768 3.60944
1   3   4.85856 3.81616
1   4   5.17424 4.08384
2   1   8.19648 5.31056
2   2   8.04848 5.33568
2   3   7.82016 5.29088
2   4   7.80464 5.31632
2   5   7.68256 5.4624
2   6   7.62592 5.572

如何有效地做到这一点?我可以考虑使用 for 循环和 vertcat 的一些想法,但它是有史以来最慢的解决方案:/

谢谢!

【问题讨论】:

  • 轨迹短于 2 是什么意思?
  • 哦,对不起,愚蠢的我 :) 当然,比 f.ex 短。 4 = 少于 4 帧的轨迹
  • 这个矩阵是一种非常低效的存储信息的方式。即使您只是将其拆分并将“小”矩阵存储在一个单元格中,这样对结果的“过滤”也是微不足道的。

标签: matlab sorting matrix filtering


【解决方案1】:

这里有一个与@Ansari略有不同的解决方案:

t = 1:max(A(:,1));                  %# possible track numbers
tt = t( histc(A(:,1),t) >= 4 );     %# tracks with >= 4 frames
B = A(ismember(A(:,1),tt),:);       %# filter rows
[~,~,B(:,1)] = unique(B(:,1));      %# renumber track numbers

在上面的代码中计算索引变量tt 的另一种方法:

tt = find( accumarray(A(:,1), 1, [], @(x)numel(x)>=4) );

【讨论】:

    【解决方案2】:

    这将过滤掉那些长度小于 4 的轨迹:

    [v, u1, w] = unique(A(:, 1), 'last');
    [~, u2, ~] = unique(A(:, 1), 'first');
    keys = v(find(u1 - u2 >= 3));
    B = A(ismember(A(:, 1), keys), :);
    

    这将对它们重新编号:

    [~, ~, B(:, 1)] = unique(B(:, 1));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-08
      • 1970-01-01
      • 2012-09-27
      • 1970-01-01
      相关资源
      最近更新 更多