2012-06-01 89 views
1

我有一个huuuge矩阵存储关于X和Y坐标的信息的多个颗粒的轨迹,这在简化版本看起来像这样的:MATLAB:简单矩阵过滤 - 组大小

COL 1-轨道号; col 2帧数; col 2 - 坐标X;山坳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的一些想法,但它是有史以来最慢的解决方案:/

谢谢!

+0

你是什么意思是短于2的轨迹? –

+0

哦对不起,笨我:)当然,比f.ex短。 4 =小于4帧的轨迹 – Art

+0

该矩阵是存储该信息的非常低效的方式。即使你只是将其分割并将“小”矩阵存储在单元格中,结果的“过滤”也是微不足道的。 – bdecaf

回答

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)); 
+0

谢谢!作品像一个魅力:) – Art

+0

不客气 - 祝你好运! – Ansari

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