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

使用 octave 的广播能力,它存在于 3.6.3 中(不确定何时引入),您可以简单地说:

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 回答