2

2つのマトリックスAとBがあり、どちらにもイベントの開始時間と停止時間のリストが含まれています。

A(i,1) = onset time of event i
A(i,2) = offset time of event i
B(j,1) = onset of event j
...

私の目標は、重複しているイベントのセットを含む、2aIdxつの不確定bIdxなリストを取得することです。A(aIdx,:)B(bIdx,:)

私はこれを理解しようと一日中頭を悩ませてきました。これを行うための迅速で簡単なmatlabyの方法はありますか?

forループを使用してそれを行うことはできますが、これはmatlabにとってはちょっとハッキーなようです。

aIdx = [];
bIdx = []
for i=1:size(A,1)
    for j=i:size(B,1)
        if overlap(A(i,:), B(j,:)) % overlap is defined elsewhere
            aIdx(end+1) = i;
            bIdx(end+1) = j;
        end
    end
end
4

4 に答える 4

3

ゼロループソリューションは次のとおりです。

overlap = @(x, y)y(:, 1) < x(:, 2) & y(:, 2) > x(:, 1)
[tmp1, tmp2] = meshgrid(1:size(A, 1), 1:size(B, 1));
M = reshape(overlap(A(tmp1, :), B(tmp2, :)), size(B, 1), [])';
[aIdx, bIdx] = find(M);
于 2012-04-24T19:40:48.053 に答える
1

あなたは1つのループでそれを行うことができます:

aIdx = false(size(A,1),1);
bIdx = false(size(B,1),1);
for k = 1:size(B,1)
    ai = ( A(:,1) >= B(k,1) & A(:,1) <= B(k,2) ) | ...
           ( A(:,2) >= B(k,1) & A(:,2) <= B(k,2) );
    if any(ai), bIdx(k) = true; end
    aIdx = aIdx | ai;
end

ベクトル化されたアルゴリズムを作成する方法があります。(以前に同様の関数を作成しましたが、現在は見つかりません。)単純なワークフローは、(1)両方のマトリックスを結合し、(2)各イベントのソースを示すインデックスを作成し、(3)開始とを示すマトリックスを作成することです。停止位置、(4)ベクトル化およびソート、(5)diff、cumsum、または組み合わせとの重複を見つけます。

于 2012-04-24T18:05:12.537 に答える
1
overlap_matrix = zeros(size(A,1),size(B,1))

for jj = 1:size(B,1)
    overlap_matrix(:,jj) = (A(:,1) <= B(jj,1)).*(B(jj,1) <= A(:,2));       
end

[r,c] = find(overlap_matrix)
% Now A(r(i),:) overlaps with B(c(i),:)

% Modify the above conditional if you want to also check
% whether events in A start in-between the events in B
% as I am only checking the first half of the conditional
% for simplicity.
于 2012-04-24T19:02:02.723 に答える
0

repmatやreshapeを使用せずに完全にベクトル化されたコード(できれば高速化も可能)。関数「overlap」は、A(req_indices、:)とB(req_indices、:)の完全なペアが与えられた場合、1と0のベクトルを与えることができると仮定しました。オーバーラップがベクトル出力を返すことができる場合、ベクトル化は以下のように実行できます。

A行列の行をRa、B行列の行をRbとします。

AA=1:Ra;
AAA=AA(ones(Rb,1),:);
AAAA=AAA(:); % all indices of A arranged in desired format, i.e. [11...1,22..2,33...3, ...., RaRa...Ra]'

BB=(1:Rb)';
BBB=BB(:,ones(Ra,1)); 
BBBB=BBB(:);% all indices of B arranged in desired format, i.e. [123...Rb, 123...Rb,....,123...Rb]'

% Use overlap function
Result_vector = overlap(A(AAAA,:), B(BBBB,:));
Result_vector_without_zeros = find(Result_vector);
aIdx = AAAA(Results_vector_without_zeros);
bIdx = BBBB(Results_vector_without_zeros);

短所:より大きなマトリックスにはRAMの消費量が多すぎます

于 2012-04-24T20:19:05.227 に答える