1

複数の粒子軌跡の X 座標と Y 座標に関する情報を格納する巨大なマトリックスがあります。簡略化されたバージョンでは次のようになります。

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 を使用していくつかのアイデアを考えることができますが、これまでで最も遅いソリューションです :/

ありがとう!

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 に答える