3

I'm testing an arbitrarily-large, arbitrarily-dimensioned array of logicals, and I'd like to find out if any one or more of them are true. any() only works on a single dimension at a time, as does sum(). I know that I could test the number of dimensions and repeat any() until I get a single answer, but I'd like a quicker, and frankly, more-elegant, approach.

Ideas?

I'm running 2009a (R17, in the old parlance, I think).

4

2 に答える 2

10

データが行列Aにある場合は、これを試してください。

anyAreTrue = any(A(:));

編集:構文に慣れていない人のためにもう少し説明すると、A(:)コロン演算子を使用して、次元に関係なく配列A の内容全体を取得し、それらを単一の列ベクトル (サイズの) に再形成します。 numel(A) 行 1 列)。結果の列ベクトルを操作するには、ANYを1 回呼び出すだけで済みます。

于 2009-04-02T14:14:50.193 に答える
2

指摘したように、正しい解決策は、結果をベクトルに再形成することです。次に、任意の結果が得られます。したがって、

任意の (A(:))

numel(A) 要素のいずれかが true の場合、グローバルな結果を返します。使用することもできました

any(reshape(A,[],1))

reshape 演算子を明示的に使用します。行列をベクトルに変換して適用するという余分な手順を実行したくない場合は、独自の関数を作成する別の方法があります。たとえば、これを行う関数は次のとおりです。

======================

関数の結果 = myany(A)

% は、A のいずれかの要素が非ゼロであったかどうかを判別します

結果 = 任意 (A(:));

======================

これを m ファイルとして検索パスに保存します。MATLAB の優れた点 (すべてのプログラミング言語に当てはまります) は、完全に拡張可能であることです。欲しい機能がある場合は、それを実行するためのちょっとしたイディオムを書いてください。これを頻繁に行うと、ニーズに合わせて環境をカスタマイズできます。

于 2009-04-02T15:58:08.393 に答える