2017-11-26 12 views
0

私のスクリプトはいくつかの配列を生成します。私は値のペアのリストを配列に入れてはいけません。ペアは対称ですが、ペア[1 2]が好きでなければ、ペア[2 1]も悪いです。 「悪い」配列を検出するには、次の方法を使用します。速い方法は、MATLAB配列の値のペアの1つを検出する

%% SAMPLE DATA 
Pair2Find=[1,2;4,6;7,10]; % value pairs to detect 
Seq=randi(10,1,10000); % array where detect pairs 
%% DETECTION 
for iPair=1:size(Pair2Find) 
    idx=find(or(Seq(1:end-1)==Pair2Find(iPair,1)&Seq(2:end)==Pair2Find(iPair,2),... 
     Seq(1:end-1)==Pair2Find(iPair,2)&Seq(2:end)==Pair2Find(iPair,1))); 
    if (~isempty(idx)) 
     display('Bad array') 
     break 
    end 
end 

すべては問題なく動作しますが、プログラムのボトルネックです。あなたのペアの行列が非常に大きい場合は、次のよう

はあなたが

答えて

1
pairs = [1 2; 4 6; 7 10]; 
seq = randi(10,1,10000); 

for i = 1:size(pairs,1) 
    pair = pairs(i,:); 
    res = strfind(seq,pair); 

    if (~isempty(res)) 
     disp('Bad array!'); 
     break; 
    end 

    pair = fliplr(pair); 
    res = strfind(seq,pair); 

    if (~isempty(res)) 
     disp('Bad array!'); 
     break; 
    end 
end 

私はこのコードの品質とスピードを向上するのに役立つ可能性があり、また、あなたのループ時間(少し)を高めることができます:

pairs = [1 2; 4 6; 7 10]; 
pairs_flip = fliplr(pairs); 

seq = randi(10,1,10000); 

for i = 1:size(pairs,1) 
    res = strfind(seq,pairs(i,:)); 

    if (~isempty(res)) 
     disp('Bad array!'); 
     break; 
    end 

    res = strfind(seq,pairs_flip(i,:)); 

    if (~isempty(res)) 
     disp('Bad array!'); 
     break; 
    end 
end 
0

あなたがintersectのような集合演算ではかなり単純にこれを行うことができますn x 2配列にあなたのベクトルをreshapeことができるしている場合。ヘルパー関数を作成して、不良ペアが存在するかどうかを検出し、それ以降のロジックに使用できるブール値を返すことができます。例えば

Pair2Find = [1,2;4,6;7,10]; % value pairs to detect 
Seq = randi(10,1,1000000); % array where detect pairs 
Seq = reshape(Seq, 2, []).'; % Reshape to a 2 column array 

test = isbad(Seq, Pair2Find); 

function [outbool] = isbad(Seq, Pair2Find) 
sortSeq = sort(Seq, 2); % Sort the pairs 
uniquepairs = unique(sortSeq, 'rows'); % Find unique pairs 
test = intersect(Pair2Find, uniquepairs, 'rows'); % Find pair intersection 
outbool = ~isempty(test); 
end 
関連する問題