Octave 倍频程:比较两个向量

Octave 倍频程:比较两个向量,octave,Octave,我有这个向量: 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

我有这个向量:

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循环来实现这一点,但我想将此操作矢量化。

您要查找的是函数
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

使用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版本不支持广播,或者您希望使其与旧版本兼容,则可以用bsxfun(@eq,A',t)替换“==t)。

-1:只是隐式等效于。结果肯定不同于
ismember
,因此比较这两者是没有意义的。很抱歉,如果您费心阅读它,您会看到任何(A'==t)都会产生与bsxfun相同的结果。如果你愿意,你可以试试。至于bsxfun,除了您之外,没有人提到过任何关于bsxfun的内容,所以我真的不认为这一点有什么关联。。。但即使存在相关性,代码可读性也是相关的,如果八度音阶广播更容易阅读,那就更好了。另外,无论出于什么原因,我发现广播速度稍微快一点。。。在B=bsxfun(@eq,t,A')上循环10000次所需的时间比在B=A'==t上循环10000次所需的时间多10%左右。你能举一个ismember给出不同结果的例子吗?因为我看不出在什么情况下它会这么做。如果它确实给出了不同的结果,是ismember还是我的解决方案给出了正确的结果?很抱歉,当我试图运行您的代码时,我确实错过了
any
,因此我取消了否决票。但是,我必须指出,
ismember
对于大型数组(数千个元素)来说速度明显更快。我把注意力限制在与所给例子相似的例子上。我稍微编辑了一下答案,以注意到只有较小的阵列才会更快。