2017-05-08 3 views
1

私は365x4のサイズの行列を持っています(それは毎日のデータなので)。後で分析するために、特定の値(この場合は10)よりも低い最初の列から連続した値を選択する必要があります。Matlab:特定の値より低い連続した値を選択してください

Matlabでは、10より小さい値だけでなく、少なくとも2つの連続する値のうちの10より小さい値を見つける方法を定義することはできますか?

現在のコード:

bad_consecutive_radiation_days=disp(find(average_day_radiati‌​on(:,1)<10 &~ diff(average_day_radiation(:,1))<10)); 
+1

どのくらい連続していなければなりませんか?最初の連続したセット、または連続したデータを含むすべてのグループが必要ですか?どのコードを試しましたか? – Wolfie

+1

10より小さいインデックスを見つけて連続したインデックスを作成し、最終的に結果を得るためにデータをインデックス化します – GameOfThrows

+0

また、Image Processing Toolboxはありますか?イメージ処理ツールボックスのいくつかの機能を使用して、すばやく、頑強な方法でそれを行うことができます。 – edwinksl

答えて

0

は論理インデックスとdiff機能の組み合わせを使用して、このような何かを試してみてください。詳細

についてのコメントを参照してください
% Test data (column vector of values greater or less than 10) 
mydata = [10, 9, 9, 10, 9, 10, 9, 9, 9, 10, 10, 10, 9, 9, 10]'; 
% Test for values less than 10 
lowvalues = mydata(:,1) < 10; 
% Get differences of test, for consecutive logic 
consec = [0; diff(lowvalues)]; 
% Apply logic for more than 1 consecutive "lowvalues" element being true consecutively 
output = [(consec(1:end-1) == 1 & consec(2:end) == 0) | ... 
      (consec(1:end-1) == 0 & consec(2:end) == 0 & lowvalues(1:end-1) == 1) | ... 
      (consec(1:end-1) == 0 & consec(2:end) == -1); false] 
% First test: elements at start of consectutive list 
% Second test: elements in the middle of consecutive list, which are low values 
% Third test: elements at the end of the consecutive list 

結果:あなたが見ることができるように、単独の9が連続したグループ内のように見える、とすべてのグループ化された9Sがあるされていない

% Test data and output: 
mydata = [10, 9, 9, 10, 9, 10, 9, 9, 9, 10, 10, 10, 9, 9, 10]' 
output = [ 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0]' 

。あなたはfind(output)を使ってインデックスを得ることができます。

あなたは

desireddata = mydata(output); 
% result: [9,9,9,9,9,9,9], the elements 2,3,7,8,9,13,14 from mydata 

編集使用して所望のデータのみを抽出することができます。

だけdesireddata文を変更して、これを満たす行列からを取得することを。つまり、上記のmydataを連続した値をテストする列に置き換えます。

% Take the consecutive-value rows and all of the columns from a matrix 
myConsecutiveValuesMatrix = myWholeMatrix(output, :) 
+0

ありがとう@Wolfie!もう1つの疑問は、これがマトリックスに対して可能であるということですか?私はこれらの連続値を取得する必要がある列が1つの列であることを意味しますが、最後に対応する列も必要です。 –

+0

私の編集@Andreaを見て、あなたの質問に答えた場合はこれを受け入れたものとしてマークすることを検討してください。 – Wolfie

+0

ねえ!私はそれを昨日の夕方に試してみました。そして、それは私だけのコラムを取っただけでなく、連続的でないいくつかの値を答えに含めました....私はそれをもう一度試してみましょう、私はあなたに知らせる! –

0

画像処理の世界のヒントを使用できます。最初に入力ベクトルから1を削除します。このようなステップをN-1回繰り返す。その後、N-1ステップを実行して、N-1ステップ前に1を追加します。

lowvals = data < 10; 
lowvals(end+1) = false; % Make fictional last point which is false to avoid edge checks. 
N = 2; % in your case when you want numbers where at least 2 are above. 
for i = 1 : N-1 
    lowvals(1:end-1) = lowvals(1:end-1) & lowvals(2:end); 
end 
for i = 1 : N-1 
    lowvals(2:end) = lowvals(2:end) | lowvals(1:end-1); 
end 
% At this point, lowvals will have filtered indices with that extra fictional value. Remove it. 
lowvals = lowvals(1:end-1); 

は、このコードは、架空の最後のポイントのこの設定を移動することによって、ビットを最適化することができます:ちょうど

だから、N.変更することで、5を言うために2つの値から延長するのは簡単であるよう このアプローチはいいです他のポイントを設定する前に(配列の拡張を避けるため)、私はそれがこのように明確であると信じています。

+0

ありがとう、私はこれをチェックします! –

関連する問題