2012-06-01 2 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 loop и 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)); 
Смежные вопросы