4

私はこのベクトルを持っています:

t = 1: 10 % t = 1 2 3 ..10

A= [3 4 5] % a column vector 

私が入力した場合:

(3 == t)

私は結果を得る:

0 0 1 0 0 0 0 0 0 0 % it means: 1 at location equals, and 0 at others

ベクトル a に対してこれを行いたいとします。つまり、ベクトル A の各要素を取得し、別のベクトルを比較して返します。したがって、この場合、結果は 3×10 行列になります。

しかし、この行はエラーになります: A==t.

もちろん、これは for ループを使用して実行できますが、この操作をベクトル化したいと考えています。

4

2 に答える 2

8

あなたが探しているのは機能ですismember

octave> t = 1:10
t =
    1    2    3    4    5    6    7    8    9   10

octave> A = ismember (t, [2 3 4])
A =
   0   1   1   1   0   0   0   0   0   0
于 2012-08-26T17:54:14.080 に答える
3

3.6.3 に存在する octave のブロードキャスト機能 (いつ導入されたかは不明) を使用すると、次のように簡単に言うことができます。

A'==t

carandraug のismemberコマンドと同じ結果を生成する場合は、次のように「any」を追加するだけです。

any(A'==t)

この方法は、より小さいベクトルの ismember アプローチよりもはるかに高速です。

octave:209> tic; for i=1:10000 B=ismember(t,A); end; toc;
Elapsed time is 1.5 seconds.
octave:211> tic; for i=1:10000 B=any(A'==t); end; toc;
Elapsed time is 0.2 seconds.

注: お使いの octave のバージョンがブロードキャストをサポートしていない場合、または古いバージョンとの互換性を維持したい場合は、A'==t を bsxfun(@eq,A',t) に置き換えることができます。

于 2013-03-16T14:41:39.563 に答える