【问题标题】:Matlab how to bitwise-AND of a vector and a matrix?Matlab如何对向量和矩阵进行按位与?
【发布时间】:2014-05-01 14:20:41
【问题描述】:

我想找出向量出现的矩阵列的索引。我的想法是在矩阵上对向量进行 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 甚至更好的 Octave 中做到这一点?

【问题讨论】:

    标签: matlab matrix octave


    【解决方案1】:

    不太确定您是如何尝试解决该问题的。但是使用repmatbsxfun 就这么简单:

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

    【讨论】:

      【解决方案2】:

      怎么样

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

      【讨论】:

        【解决方案3】:

        我发现了函数

        ismember(H', S, "rows") 
        

        完全按照我的意愿工作。你的回答也很好,谢谢。

        【讨论】:

        • 是的,这也可以,但是 1) 你需要横穿大矩阵,即使这不是问题,2) 它最终会慢 10 倍,这对于大矩阵会有所作为。试试H = rand (10, 1000000); 看看吧。
        • 感谢您的评论,我在 matlab 中真的没有这样的知识知道这一点。我会改变你的建议
        • ups,在我的第一条评论中,我的意思是“转置”,而不是“横向”。
        • 我使用我的解决方案改进了 Octave 的 ismember(),以针对 S 中 1 行的特定情况。这意味着如果您使用 Octave 4.2 或更高版本(尚未发布,ismember 实际上将在后面使用广播。请参阅 cset 89055521e04d
        【解决方案4】:

        广播很容易。以下将需要 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 来获取列号了。如果匹配超过 1 列,它甚至会起作用:

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

        【讨论】:

          猜你喜欢
          • 2021-12-04
          • 2011-09-28
          • 2014-01-02
          • 1970-01-01
          • 1970-01-01
          • 2016-10-27
          • 1970-01-01
          • 1970-01-01
          • 2016-07-16
          相关资源
          最近更新 更多