2
A=[1 2 3 4 5 0 0 0 0 0 0 0 0 0 0 0 0;
   0 1 2 3 4 5 0 0 0 0 0 0 0 0 0 0 0;
   0 0 0 1 2 3 4 5 0 0 0 0 0 0 0 0 0; 
   0 0 0 0 0 0 0 0 0 0 0 0 1 2 3 4 5;
   0 0 0 0 0 0 0 1 2 3 4 5 0 0 0 0 0;
   0 0 0 0 0 0 0 1 2 3 4 5 0 0 0 0 0];

値が1より大きく4より小さい要素のみを持つ列の数値「1」をカウントするコードとは何ですか。

注:ゼロは無視されます。

したがって、私の期待される出力はres = 1、2番目の列のみにあります。

これが私が試したことです:

res = sum( sum(A(2 :end,all(A>1&A<4))==1, 2),1 );

しかし、ゼロはまだ私のコードでカウントされています。

4

1 に答える 1

1

私がそれを正しく理解しているなら、あなたはそれをこのように行うことができます:

A私の要素が4以下であるという最初のルールに違反するすべての列を見つけることから始めます

[~, del, ~] = find(A>=4)

それらの列を削除します。

A(:, unique(del)) = []

これは次のようになります。

 A =
 1     2     3     0     0     0     0     0
 0     1     2     0     0     0     0     0
 0     0     0     0     0     0     0     0
 0     0     0     0     0     1     2     3
 0     0     0     2     3     0     0     0
 0     0     0     2     3     0     0     0

1これで、 :を持つ残りのすべての列が見つかります。

[~, c1, ~] = find(A == 1);

1そして、2番目の要件に従うよりも少なくとも1つの値が大きいすべての列:

[~, c2, ~] = find(A > 1)

これらのベクトルc1c2列番号を使用して、単純に交差してカウントします。

numel(intersect(c1, c2))

現在、このフォーラムにはたくさんのMatlabウィザードがあり、私の本能はもっと良い答えがあると言っているので、少し待つ必要があります。

于 2012-10-12T19:45:40.530 に答える