2012-06-01 138 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));