【问题标题】:Checking equality of row elements in Matlab?在Matlab中检查行元素的相等性?
【发布时间】:2015-04-22 15:00:23
【问题描述】:

我在 Matlab 中有一个矩阵 A,维度为 mxn。我想构造一个维度为mx1 的向量B,如果A(i,:) 的所有元素都相等,则B(i)=1,否则0。有什么建议吗?例如

A=[1 2 3; 9 9 9; 2 2 2; 1 1 4]
B=[0;1;1;0]

【问题讨论】:

    标签: matlab


    【解决方案1】:

    diff 的一种方式-

    B = all(diff(A,[],2)==0,2)
    

    或者bsxfun -

    B = all(bsxfun(@eq,A,A(:,1)),2)
    

    【讨论】:

      【解决方案2】:

      这是另一个更模糊的例子,但也能起到作用:

      B = sum(histc(A,unique(A),2) ~= 0, 2) == 1;
      

      那么这是如何工作的呢? histc 计算数据集中数字出现的频率或出现次数。 histc 的酷之处在于我们可以独立计算沿维度的频率,因此我们可以做的是分别计算沿矩阵A 每一行的值的频率。 histc 的第一个参数是您要计算其值频率的矩阵。第二个参数表示边缘,或者您要在矩阵中查看哪些值来计算频率。我们可以通过在整个矩阵上使用unique 来指定所有可能的值。下一个参数是我们要操作的维度,我想处理所有列,因此指定了2

      histc 的结果将为我们提供一个M x N 矩阵,其中M 是矩阵A 中的总行数,NA 中唯一值的总数。接下来,如果一行包含所有相等的值,则该行中应该只有 一个 值,其中所有值都被分箱在其余值为零的位置。因此,我们确定该矩阵中的哪些值非零并将其存储到结果矩阵中,然后沿结果矩阵的列sum 并查看每一行的总和是否为 1。如果是,则此A 的行具有所有相同的值。


      当然不如 Divakar 的 diffbsxfun 方法那么有效,但是因为他采用了我会使用的两种方法,所以可以替代:P

      【讨论】:

      • 你们留下的选择很少! :-)
      【解决方案3】:

      更多选择:

      B = var(A,[],2)==0;
      B = max(A,[],2)==min(A,[],2)
      

      【讨论】:

      • 哦。 max/min 检查非常非常聪明。 +1。变数也是!甚至可以探索meanB = mean(A, [], 2) == A(:,1); 尽管有浮点错误。
      猜你喜欢
      • 2014-11-14
      • 2015-11-23
      • 1970-01-01
      • 2017-06-07
      • 1970-01-01
      • 2013-08-27
      • 2018-06-28
      • 1970-01-01
      • 2019-02-25
      相关资源
      最近更新 更多