Matlab如何对向量和矩阵进行位与运算?

Matlab如何对向量和矩阵进行位与运算?,matlab,matrix,octave,Matlab,Matrix,Octave,我想找出向量出现的矩阵列的索引。我的想法是对矩阵上的向量进行AND运算,在新的vecotr中,只有相同的列是1。但我不知道怎么做。下面是一个例子: H = 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 0 0 0 1 1 1 1 0 1 0 0 1 0 1 1 0 1 1 0 0 1 1 0 0 1

我想找出向量出现的矩阵列的索引。我的想法是对矩阵上的向量进行AND运算,在新的vecotr中,只有相同的列是1。但我不知道怎么做。下面是一个例子:

H =
0   0   0   0   1   1   1   1   1   1   1   1   0   0   0
0   1   1   1   0   0   0   1   1   1   1   0   1   0   0
1   0   1   1   0   1   1   0   0   1   1   0   0   1   0
1   1   0   1   1   0   1   0   1   0   1   0   0   0   1

S =
0   1   0   1
由此我想得到2作为第二列,或者更好的向量

0 1 0 0 0 0 ... 0 
因为第二列中有错误

如何在Matlab或更好的倍频程中实现这一点

result = sum(H==repmat(S(:),[1 size(H,2)]))==4;

我不确定你是如何解决这个问题的。但是使用
repmat
bsxfun
就这么简单:

all(bsxfun(@eq,H,S'))

广播很容易做到。以下内容需要Octave 3.6.0或更高版本,但如果您有以前的版本,则可以使用
bsxfun

octave-cli-3.8.1> h = logical ([
0   0   0   0   1   1   1   1   1   1   1   1   0   0   0
0   1   1   1   0   0   0   1   1   1   1   0   1   0   0
1   0   1   1   0   1   1   0   0   1   1   0   0   1   0
1   1   0   1   1   0   1   0   1   0   1   0   0   0   1]);
octave-cli-3.8.1> s = logical ([0   1   0   1]');
octave-cli-3.8.1> all (h == s)
ans =

   0   1   0   0   0   0   0   0   0   0   0   0   0   0   0
从这里开始,只需使用find获取列号。如果它匹配多个列,它甚至可以工作:

octave-cli-3.8.1> find (all (h == s))
ans =  2

我找到了函数

ismember(H', S, "rows") 

工作完全符合我的要求。您的答案也都很好,谢谢。

是的,这也很有效,但1)您需要横切大矩阵,即使这不是问题,2)它至少会慢10倍,这对于大矩阵将产生影响。只要尝试一下
H=rand(101000)自己看看。谢谢你的评论,我真的没有matlab的知识来知道这一点。我将改为您的建议,我在第一次评论中的意思是“转置”,而不是“横向”。对于
s
中1行的特定情况,我使用我的解决方案改进了Octave的
ismember()
。这意味着,如果您使用Octave 4.2或更高版本(尚未发布,
ismember
实际上将在后面使用广播。请参阅cset