Matlab如何对向量和矩阵进行位与运算?
我想找出向量出现的矩阵列的索引。我的想法是对矩阵上的向量进行AND运算,在新的vecotr中,只有相同的列是1。但我不知道怎么做。下面是一个例子: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
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