0

私の質問をする最良の方法は、明確な例を使用することです。2つのタイムライン(秒単位の時間など)AとBについて考えます。ここで、各タイムラインの間隔は次のとおりです。

intervals_a = 
   0 1
   1 4
   4 7
   7 9

intervals_b = 
   0 2
   2 3
   3 5
   5 8

最初のa間隔が最初のb間隔と重なっていることに注意してください。2番目のa間隔は、1番目、2番目、および3番目のb間隔と重なり、以下同様に続きます。

最終的に、以下のようにb間隔と重なるa間隔のインデックスを示す出力が必要です。

output = 
   1 1   \\ 1st a-interval overlaps 1st b-interval
   2 1   \\ 2nd a-interval overlaps 1st b-interval
   2 2   \\ 2nd a-interval overlaps 2nd b-interval
   2 3   \\ 2nd a-interval overlaps 3rd b-interval
   3 3   \\ etc...
   3 4
   4 4

大きな課題は次のとおりです。ソリューションにfor/whileループを含めることはできません(「理由」は無関係です)。これは、ベクトル/行列/配列/並べ替えまたは他のツールを使用して効率的に実行できますか?MATLABの実装は完璧ですが、他の言語でも問題ありません。前もって感謝します!

4

2 に答える 2

1

重複する間隔を見つけるには、ある間隔の開始時刻または終了時刻が別の間隔の境界内にあるかどうかを確認する必要があります。一度にすべての間隔でそれを行うには、次を使用できますbsxfun

ovlp = @(x, y)bsxfun(@ge, x(:, 1), y(:, 1)') & bsxfun(@le, x(:, 1), y(:, 2)');
idx = ovlp(intervals_a, intervals_b) | ovlp(intervals_b, intervals_a)';
[row, col] = ind2sub(size(idx), find(idx));
output = [row, col];

これがあなたの例でどのように機能するか見てみましょう:

intervals_a = [0 1; 1 4; 4 7; 7 9]
intervals_b = [0 2; 2 3; 3 5; 5 8]

匿名関数は、の開始時刻(つまり)がで指定された間隔内にあるovlpかどうかをチェックします。したがって、次のようになります。xx(:, 1)yovlp(intervals_a, intervals_b)

ans =
     1     0     0     0
     1     0     0     0
     0     0     1     0
     0     0     0     1

'1'は、interval_aの開始時刻がinterval_b内のどこにあるかを示します。行番号はの間隔のインデックスでintervals_aあり、列番号はの間隔のインデックスですintervals_b

の開始時間に対して同じプロセスを実行してintervals_b、重複するすべての間隔を見つける必要があり、2つの結果の間で論理ORを実行します。

idx = ovlp(intervals_a, intervals_b) | ovlp(intervals_b, intervals_a)'

intervals_a2番目の結果が転置され、行がに対応し、に対応しないことに注意してくださいintervals_b。結果の行列idxは次のとおりです。

idx =
     1     0     0     0
     1     1     1     0
     0     0     1     1
     0     0     0     1

最後のステップは、行列をとのidxインデックスに変換することです。したがって、「1」の行番号と列番号を取得し、それらを連結します。intervals_aintervals_b

[row, col] = ind2sub(size(idx), find(idx));
output = [row, col];

最終結果は次のとおりです。

output =
     1     1
     2     1
     2     2
     2     3
     3     3
     3     4
     4     4
于 2013-03-24T17:53:25.770 に答える
0

int_A(ii、1)> int_B(jj、1)およびint_A(ii、2)となるように、int_Aおよびint_Bのインデックス(ii、jj)が必要です。

NA = size(A_int,1);
NB = size(int_B,1);
ABlower= repmat(A_int(:,1),[1,NB]);
ABupper= repmat(A_int(:,2),[1,NB]);
BAlower= repmat(B_int(:,1),[1,NA])';
BAupper= repmat(B_int(:,2),[1,NA])';

inInt = find((ABlower>BAlower & ABlower < BAupper) | (ABupper>BAlower & ABupper<BAupper);
[ii,jj]=ind2sub([NA,NB], inInt);

現在、Matlabにアクセスできませんが、これは非常に近いと思います...

于 2013-03-24T01:12:19.730 に答える