4

非常に大きな 3D マトリックスがあり、この大きなマトリックスから特別な構成でいくつかの特定のパターンを呼び出す必要があります。たとえば、a、b、c、..、h 要素が特定の値と等しいサブマトリックスが必要です (パターン マッチングではありませんが、特定の値を持つパターンが必要です)。

それらを非常に高速に見つけるための解決策はありますか? 私が知っているように、1 つの解決策は、マトリックスをスキャンしてそのパターンをデータベースに保存し、PCA を使用してデータベースのサイズを縮小することですが、より正確な方法を探しています。

たとえば、I のような行列があるとします。

    I=[1    0   0   1   0   1   0   1   0
       0    0   0   0   0   0   0   0   0
       0    1   0   0   1   0   0   1   0
       1    0   1   1   0   1   0   1   0
       0    0   0   0   0   0   0   0   0
       1    0   0   0   1   0   1   0   0
       0    0   0   0   0   0   0   0   0
       1    0   1   0   0   0   0   0   1
       0    0   1   0   0   0   0   1   0]

次に、次のような別のマトリックスがあります。

    p=[1    0   NaN NaN 1   NaN NaN NaN NaN]

次に、「I」を調べて、列 1、2、および 5 がそれぞれ 1、0、1 に等しい行を見つける必要があります (この例では、6 行が正しい行です。しかし、実際には、私の行列 (I) のサイズは非常に大きく (10 億以上)、これらの行を見つけるためにループを使用すると、多くの時間が必要になります. 高速なコードまたはメソッドを探しています. 今すぐ意味があることを願っています!

4

1 に答える 1

1

探しているパターンが列単位の場合、次のようにすることができます: (そうでない場合は、質問をより具体的にしてください。回答を変更します)

A=randi(10,[11 12 13]); %%% your matrix
p=[2;3;4]; %%% your pattern

m=cell(1,numel(p));
% for each element of the pattern
for i=1:numel(p)
  % find the element of A matching the i-th element of p
  m{i}=find(A==p(i));
  % convert to indices
  [x y z]=ind2sub(size(A),m{i});
  m{i}=[x y z];
  % convert to the position of the first element of the pattern
  m{i}(:,1)=m{i}(:,1)-(i-1);
  % remove when it goes below zero
  m{i}(m{i}(:,1)<=0,:)=[];
end

% accumulate everything to find out where all the elements of the pattern match
numberOfMatching=accumarray(vertcat(m{:}),1,size(A)); 
fullMatchingIndices=find(numberOfMatching==numel(p));
% convert to sub=indices
[x y z]=ind2sub(size(A),fullMatchingIndices);
finalIndices=[x y z];

% check the result
if ~isempty(finalIndices)
  A(finalIndices(1,1)+(0:numel(p)-1),finalIndices(1,2),finalIndices(1,3))
end

その結果、パターン p を取得する必要があります (少なくとも 1 つの一致が見つかった場合)。

ans =
     2
     3
     4
于 2012-09-28T00:05:01.260 に答える