1

我有一个 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 的一些想法,但它是有史以来最慢的解决方案:/

谢谢!

4

2 回答 2

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));
于 2012-06-01T05:28:10.263 回答
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) );
于 2012-06-01T06:01:05.770 回答