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