0

この行列に「1」のインスタンスが2つ以上ある連続する3列のグループを識別しようとしています。

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〜3には「1」(> 2)の4つのインスタンスがあります。列2〜4には、「1」のインスタンスが2つだけあります(> 2ではありません)。列3〜5には、「1」(> 2)の3つのインスタンスがあります。残りの3列のグループには、「1」のインスタンスが2つを超えていません。したがって、望ましい結果は次のようになります。

[1 0 1 0 0 0 0 0 ... ]
4

2 に答える 2

5

質問を言い換えると、 隣接する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

結果はtruefalse値の行列です。ただし、これらの値を合計することもでき、それらは自動的に浮動小数点数に昇格されます。

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つあります。

于 2012-08-27T13:58:41.503 に答える
1

ワンラインソリューション:

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];

found = conv(sum(A ==1), [1 1 1], 'valid') > 2

結果:

found =

     1     0     1     0     0     0     0     0     0     0     0     0     0     0     0
于 2012-08-27T11:48:06.483 に答える