質問を言い換えると、
隣接する3つの列の値が1の行列要素の数が2より大きいかどうかを知りたいと思います。
仮に、あなたは行列を持っているとしましょう
A = [1 2 3 4 5 6 7 8 9 10 11 0 0 0 0 0 0;
0 1 2 3 4 5 6 7 8 9 10 11 0 0 0 0 0;
0 0 0 0 1 2 3 4 5 6 7 8 9 10 11 0 0;
1 2 3 4 5 6 7 8 9 10 11 0 0 0 0 0 0;
0 0 1 2 3 4 5 6 7 8 9 10 11 0 0 0 0;
0 0 0 0 1 2 3 4 5 6 7 8 9 10 11 0 0]
要素が何らかの条件を満たすかどうかを、二項演算子を使用して簡単に比較できます。たとえば、行列要素が1に等しいかどうかをテストしましょう。
A == 1
ans =
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
結果はtrue
とfalse
値の行列です。ただし、これらの値を合計することもでき、それらは自動的に浮動小数点数に昇格されます。
numOnesPerColumn = sum(A==1)
numOnesPerColumn =
2 1 1 0 2 0 0 0 0 0 0 0 0 0 0 0 0
ご覧のとおり、結果は、すべての列に対して1に等しい要素の数を保持するベクトルです。残っている唯一のタスクは、3つの連続する数の合計が2より大きいかどうかを調べることです。かなりの方法、例えば
numOnesIn3Columns = arrayfun(@(x) sum(numOnesPerColumn(x:x+2)), ...
1 : length(numOnesPerColumn) - 2);
ループを使用する別のアプローチ(おそらくMatlabの初心者のために書くのが簡単です):
numOnesIn3Columns = zeros(1, length(numOnesPerColumn) - 2);
for column = 1 : length(numOnesPerColumn) - 2
numOnesIn3Columns(column) = sum(numOnesPerColumn(column : column + 2));
end
またはあなたもすることができます
numOnesIn3Columns = filter(ones(1,3), 1, numOnesPerColumn);
numOnesIn3Columns = numOnesIn3Columns (1:end-2);
結果は、すべての場合において、3つの連続する要素の合計を含むベクトルになります。
numOnesIn3Columns =
4 2 3 2 2 0 0 0 0 0 0 0 0 0 0
では、どの列に2つ以上の1要素があるのでしょうか。これらの列の最初の列番号は、次のようにすることで簡単に見つけることができます。
find(numOnesIn3Columns > 2)
ans =
1 3
わかりました。列1〜3と3〜5は制約に違反しています。そして、これらの列には実際にいくつありますか?
numOnesIn3Columns(find(numOnesIn3Columns > 2))
ans =
4 3
したがって、列1〜3には4つ、列3〜5には3つあります。