matlab:简单矩阵过滤 - 组大小

时间:2012-06-01 04:37:24

标签: matlab sorting matrix filtering

我有一个huuuge矩阵,存储有关多个粒子轨迹的X和Y坐标的信息,在简化版本中看起来像:

col-track number;第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 loop和vertcat的一些想法,但它是有史以来最慢的解决方案:/

谢谢!

2 个答案:

答案 0 :(得分: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));

答案 1 :(得分: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) );